2015-08-04 5 views
5

Ich habe eine Textdatei und ich lese es Zeile für Zeile.Regex geteilt beim Lesen von Datei

Ich möchte eine einzelne Zeile mit ',' teilen.

Aber ich möchte die Kommas, die in Anführungszeichen stehen "" übersprungen werden.

Ich habe folgende Regex versucht und es funktioniert nicht richtig.

Wie es geht.

Der Inhalt der Datei sind

"Mobile","Custom1","Custom2","Custom3","First Name" 
"61402818083","service","in Portsmith","is","First Name" 
"61402818083","service","in Parramatta Park","is","First Name" 
"61402818083","services","in postcodes 3000, 4000","are","First Name" 
"61402818083","services","in postcodes 3000, 4000, 5000","are","First Name" 
"61402818083","services",,"are","First Name" 

Die regex

,(?=([^\"]*\"[^\"]*\")*[^\"]*$) 

Diese regex ausgibt folgenden für Zeile 5

"61402818083" 
,"First Name" 
"services" 
,"First Name" 
"in postcodes 3000, 4000, 5000" 
,"First Name" 
"are" 
"First Name" 
"First Name" 

Das Ergebnis ist wie folgt lautet wie folgt

"61402818083" 
"services" 
"in postcodes 3000, 4000, 5000" 
"are" 
"First Name" 
+2

„es funktioniert nicht richtig“ ist ungefähr so ​​nützlich für die Hilfe, um den Arzt als zu gehen und sagen: „Ich habe Schmerzen.“ – Tim

+0

@maraca hinzugefügt das gewünschte Ergebnis –

Antwort

3
using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string line = "\"61402818083\",\"services\",\"in postcodes 3000, 4000\",\"are\",\"First Name\""; 
     var reg = new Regex("\".*?\""); 
     var matches = reg.Matches(line); 
     foreach (var item in matches) 
     { 
      Console.WriteLine(item.ToString()); 
     } 
    } 
} 

OUTPUT Microsoft.VisualBasic als Referenz hinzuzufügen:

"61402818083" 
"services" 
"in postcodes 3000, 4000" 
"are" 
"First Name" 

https://dotnetfiddle.net/5GxxIo

Eine weitere mögliche Lösung:

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string line = "\"61402818083\",\"services\",\"in postcodes 3000, 4000\",\"are\",\"First Name\""; 
     Console.WriteLine(line.ToString()); 
     var reg = new Regex("(?:^|,)(\"(?:[^\"]+|\"\")*\"|[^,]*)", RegexOptions.Compiled); 
     var matches = reg.Matches(line); 
     foreach (Match match in reg.Matches(line)) 
     { 
      Console.WriteLine(match.Value.TrimStart(',')); 
     } 
    } 
} 

https://dotnetfiddle.net/rRml2D

+0

So könnten Sie auch mit Escapezeichen '' 'umgehen, indem Sie' "\" verwenden. *?[^ \\\\] \ "" 'Ich weiß nicht, wie die Politik dazu ist. – maraca

+0

hat Ihren ersten Fix verwendet. Der zweite Fix entspricht auch der gesamten Zeichenfolge als Ganzes. Danke –

5

Das Rad nicht neu erfinden. Es scheint, dass Sie versuchen, eine kommagetrennte Datei zu analysieren (auch wenn die Dateierweiterung anders ist als csv). Versuche es damit.

using (TextFieldParser reader = new TextFieldParser(@"c:\yourpath\file.csv")) 
{ 
    reader.TextFieldType = FieldType.Delimited; 
    reader.SetDelimiters(","); 
    while (!reader.EndOfData) 
    { 
     //Processing a line of the file 
     string[] fields = reader.ReadFields(); 
     // now fields contains 5 elements, e.g. 
     // fields[0] = "61402818083" 
     // fields[1] = "services" 
     // fields[2] = "in postcodes 3000, 4000, 5000" 
     // fields[3] = "are" 
     // fields[4] = "First Name" 
    } 
} 

Hinweis

Es ist erforderlich, in Ihrem Projekt

+0

es ist nicht eine CSV-Datei, sondern eine TXT-Datei und ich lese nur eine Zeile zu einer Zeit –

+3

können Sie trotzdem versuchen, das Format Ihrer Datei ist das gleiche von einem CSV. – davcs86

1

Ich glaube, Sie können dies tun nur von Streichern eins nach dem anderen verbindet.

Beispiel (nicht getestet)

using System.IO; 
using System.Text; 

int counter = 0; 
string line = String.Empty; 

StringBuilder newString = new StringBuilder(); 

StreamReader file = new StreamReader("c:\\test.txt"); 

while((line = file.ReadLine()) != null) 
{ 
    newString.Append(line + ","); 
} 

file.Close(); 

newString.ToString().TrimEnd(','); 
1
,(?=(?:[^\"]*\"[^\"]*\")*[^\"]*$) 

    ^^ 

Ihre regex ist correct.It eine unnötige capturing group hat, die die evil.See Demo stellte sich heraus zu sein.

https://regex101.com/r/fM9lY3/10