2015-08-04 19 views
5

Ho un file di testo e lo sto leggendo riga per riga.Regex diviso durante la lettura dal file

Voglio dividere una singola riga con ','.

Ma voglio le virgole che si trovano tra virgolette "" da saltare.

Ho provato a seguire regex e non funziona correttamente.

Come fare.

Il contenuto del file sono

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

L'espressione regolare è la seguente

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

Questa espressione regolare è l'output seguente per la linea 5

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

Il risultato dovrebbe essere la seguente

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

"non sta funzionando correttamente" è quanto di più utile per ottenere aiuto come andare dal medico e dire "ho dolore." – Tim

+0

@maraca ha aggiunto il risultato desiderato –

risposta

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

USCITA:

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

più 210

Una possibile soluzione:

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

In questo modo si può anche gestire l'escape di "" 'usando' "\". *?[^ \\\\] \ "" 'Non so come sia la politica su questo. – maraca

+0

ha utilizzato la prima correzione. La seconda correzione corrisponde anche all'intera stringa nel suo insieme. Grazie –

5

Non reinventare la ruota. Sembra che tu stia cercando di analizzare un file separato da virgola (anche se l'estensione del file è diversa da csv). Prova con questo.

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

Nota

è richiesto per aggiungere Microsoft.VisualBasic come riferimento nel progetto

+0

non è un file csv ma ​​un file txt e sto leggendo solo una riga alla volta –

+3

puoi provare comunque, il formato del tuo file è lo stesso di un csv. – davcs86

1

penso che si può fare questo solo unendo le stringhe uno per uno.

Esempio (non testato)

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(','); 
Problemi correlati