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);