with pattern online net example c# regex

pattern - regex online c#



C#Regex Split-comas fuera de las comillas (5)

Obtuve un montón de cadenas (segmentos de código SQL, en realidad) con el siguiente formato:

(''ABCDEFG'', 123542, ''XYZ 99,9'')

y necesito dividir esta cadena, usando C #, para obtener:

  • ''ABCDEFG''
  • 123542
  • ''XYZ 99,9''

Originalmente estaba usando un simple Split('','') , pero como esa coma dentro del último parámetro está causando estragos en la salida, necesito usar Regex para obtenerla. El problema es que todavía soy bastante novato en expresiones regulares y no puedo descifrar el patrón principalmente porque dentro de esa cadena pueden existir parámetros numéricos y alfanuméricos en cualquier momento ...

¿Qué podría usar para dividir esa cadena de acuerdo con cada coma fuera de las comillas? Aclamaciones


... o podría haber instalado el paquete NuGet LumenWorks CsvReader y hacer algo como a continuación donde leo un archivo csv que tiene contenido como por ejemplo

"hello","how","hello, how are you" "hi","hello","greetings" ...

y procesarlo así

public static void ProcessCsv() { var filename = @"your_file_path/filename.csv"; DataTable dt = new DataTable("MyTable"); List<string> product_codes = new List<string>(); using (CsvReader csv = new CsvReader(new StreamReader(filename), true)) { int fieldCount = csv.FieldCount; string[] headers = csv.GetFieldHeaders(); for (int i = 0; i < headers.Length; i++) { dt.Columns.Add(headers[i], typeof(string)); } while (csv.ReadNextRecord()) { DataRow dr = dt.NewRow(); for (int i = 0; i < fieldCount; i++) { product_codes.Add(csv[i]); dr[i] = csv[i]; } dt.Rows.Add(dr); } } }


Podrías dividir todas las comas, que tienen un número par de citas siguiéndolas, usando la siguiente Regex para encontrarlas:

",(?=(?:[^'']*''[^'']*'')*[^'']*$)"

Lo usarías como

var result = Regex.Split(samplestring, ",(?=(?:[^'']*''[^'']*'')*[^'']*$)");


Pruebe (pirateado de Jens) en el método de división:

",(?:.*?''[^'']*?'')"

o simplemente agrega signos de interrogación después de Jens ''s, eso lo hace perezoso en lugar de codicioso.


aunque a mí también me gustan los desafíos algunas veces, pero esto en realidad no es uno. lea este artículo http://secretgeek.net/csv_trouble.asp y luego continúe y utilice http://www.filehelpers.com/

[Editar1, 3]: o tal vez este artículo también puede ser de ayuda (el enlace solo muestra algún código de muestra de VB.Net pero aún así, ¡también puede usarlo con C #!): http://msdn.microsoft.com/en-us/library/cakac7e6.aspx

Intenté hacer la muestra para C # (agregar referencia a Microsoft.VisualBasic a su proyecto)

using System; using System.IO; using Microsoft.VisualBasic.FileIO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { TextReader reader = new StringReader("(''ABCDEFG'', 123542, ''XYZ 99,9'')"); TextFieldParser fieldParser = new TextFieldParser(reader); fieldParser.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited; fieldParser.SetDelimiters(","); String[] currentRow; while (!fieldParser.EndOfData) { try { currentRow = fieldParser.ReadFields(); foreach(String currentField in currentRow) { Console.WriteLine(currentField); } } catch (MalformedLineException e) { Console.WriteLine("Line {0} is not valid and will be skipped.", e); } } } } }

[Editar2]: encontré otro que podría ser de ayuda aquí: http://www.codeproject.com/KB/database/CsvReader.aspx

- Reinhard


//this regular expression splits string on the separator character NOT inside double quotes. //separatorChar can be any character like comma or semicolon etc. //it also allows single quotes inside the string value: e.g. "Mike''s Kitchen","Jane''s Room" Regex regx = new Regex(separatorChar + "(?=(?:[^/"]*/"[^/"]*/")*(?![^/"]*/"))"); string[] line = regx.Split(string to split);