C # Regex Split – comas fuera de las comillas

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 esgulps 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

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, ",(?=(?:[^']*'[^']*')*[^']*$)"); 

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/es-es/ /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: eg "Mike's Kitchen","Jane's Room" Regex regx = new Regex(separatorChar + "(?=(?:[^\"]*\"[^\"]*\")*(?![^\"]*\"))"); string[] line = regx.Split(string to split); 

… 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 product_codes = new List(); 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); } } } 

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.