2015-08-04 10 views
5

Mam plik tekstowy i czytam go wiersz po wierszu.Podział Regex podczas odczytu z pliku

Chcę podzielić pojedynczą linię za pomocą ",".

Ale chcę, aby przecinki znajdujące się w cudzysłowach "" były pomijane.

Próbowałem wykonać następujące wyrażenie regularne i nie działa poprawnie.

Jak to zrobić.

Zawartość pliku są

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

regex jest następująca

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

Ten regex jest wyprowadzanie następujących dla linii 5

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

Wynik powinien być następujący

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

„nie działa poprawnie” jest równie przydatny do uzyskania pomocy jak idzie do lekarza i mówi: „Mam ból.” – Tim

+0

@maraca dodał pożądany wynik –

Odpowiedz

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

WYJŚCIE:

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

https://dotnetfiddle.net/5GxxIo

Jednym z bardziej możliwe rozwiązanie:

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

W ten sposób można również obsłużyć uniknięte '' 'przy użyciu' "\". *?[^ \\\\] \ "" 'Nie wiem, jak polityka w tym jest. – maraca

+0

użył twojej pierwszej poprawki. Druga poprawka dopasowuje również cały ciąg znaków. Dzięki –

5

Nie wymyślaj ponownie koła. Wygląda na to, że próbujesz przeanalizować plik rozdzielany przecinkami (nawet jeśli rozszerzenie pliku różni się od csv). Spróbuj z tym.

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" 
    } 
} 

Uwaga

Jest wymagane, aby dodać Microsoft.VisualBasic jako odniesienie w projekcie

+0

nie jest to plik CSV, ale plik TXT i czytam tylko jedną linię na raz –

+3

możesz spróbować mimo to, format pliku jest taki sam jak csv. – davcs86

1

myślę, że można to zrobić tylko poprzez łączenie strun jeden po drugim.

Przykład (nie badano)

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(','); 
Powiązane problemy