2016-05-10 6 views
0

Ich habe eine sehr große Komma-getrennte Textdatei. Jedes Feld ist wie angegeben durch ein Komma begrenzt und von Anführungszeichen umgeben (alle Strings). Das Problem besteht darin, dass einige der Felder eine CR für mehrere Zeilen in diesem Feld enthalten. Wenn ich also eine ReadLine mache, stoppt sie bei CR. Es wäre schön, wenn ich ihm sagen könnte, nur bei CRLF-Kombinationen anzuhalten.Der beste Weg, um große Textdateien mit crlf Zeile Trennzeichen zu lesen

Hat jemand eine bissige Methode, dies zu tun? Die Dateien können sehr, sehr groß sein.

+0

prüfen diese [MSDN Beitrag] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/07f3fbab-53cc-4744-9eca -758b61c2f44d/streamreader-readline-neu-und-verbessert-behoben-single-crlf? Forum = netfxbcl). – ClasG

+0

Bitte geben Sie Ihren Code (Schnipsel)! Die Verwendung von Microsoft.VisualBasic.FileIO.TextFieldParser ist eine große Hilfe aus meiner Erfahrung! –

+0

Mögliches Duplikat von [Csv-Datei mit LineFeeds in den Feldern lesen] (http://stackoverflow.com/questions/18206487/read-csv-file-with-linefeeds-within-its-fields) –

Antwort

2

Wenn Sie wollen spezifische ReadLine, warum nicht implementieren?

public static class MyFileReader { 
    public static IEnumerable<String> ReadLineCRLF(String path) { 
     StringBuilder sb = new StringBuilder(); 

     Char prior = '\0'; 
     Char current = '\0'; 

     using (StreamReader reader = new StreamReader(path)) { 
     int v = reader.Read(); 

     if (v < 0) { 
      if (prior == '\r') 
      sb.Append(prior); 

      yield return sb.ToString(); 

      yield break; 
     } 

     prior = current; 
     current = (Char) v; 

     if ((current == '\n') && (prior == '\r')) { 
      yield return sb.ToString(); 

      sb.Clear(); 
     } 
     else if (current == '\r') { 
      if (prior == '\r') 
      sb.Append(prior); 
     } 
     else 
      sb.Append(current); 
     } 
    } 
    } 

Dann nutzen Sie es

var lines = MyFileReader 
    .ReadLineCRLF(@"C:\MyData.txt"); 
1

Wie wäre es mit

string line = File.ReadAllText("input.txt"); // Read the text in one line 

spaltete es dann auf Carriage Return/Zeilenvorschub wie folgt aus:

var split = line.Split('\n'); // I'm not really sure it's \n you'll need, but it's something! 

und dann wird die Verarbeitung wie durch die Linie in einer Schleife

foreach(var line in split) { ... } 
+0

Ich habe das versucht: Regex Splitter = neue Regex ("\ r \ n"); Zeichenfolge [] AllLines = Splitter.Split (iFile.ReadToEnd()); Etwas, worauf Sie beziehen, aber auf CRLF spalten, aber ich bekomme immer noch die gelegentliche Trennung auf einer CR allein. Sehr komisch. –

Verwandte Themen