2016-05-10 2 views
0

У меня очень большой текстовый файл с разделителями-запятыми. Каждое поле, как указано, ограничено запятой и окружено кавычками (все строки). Проблема в том, что некоторые из полей содержат CR для нескольких строк внутри этого поля. Поэтому, когда я делаю ReadLine, он останавливается на этом CR. Было бы неплохо, если бы я мог сказать это ТОЛЬКО остановке в комбинациях CRLF.Лучший способ чтения больших текстовых файлов с разделителем строк crlf

Есть ли у кого-нибудь быстрый метод для этого? Файлы могут быть очень большими.

+0

Проверьте это [MSDN сообщение] (https://social.msdn.microsoft.com/Forums/vstudio/en-US/07f3fbab-53cc-4744-9eca -758b61c2f44d/StreamReader-Readline-новой и улучшенной фиксированной одной CRLF? форум = netfxbcl). – ClasG

+0

предоставьте свой код (фрагмент)! Использование Microsoft.VisualBasic.FileIO.TextFieldParser - большая помощь от моего опыта! –

+0

Возможный дубликат [Прочитать файл Csv с помощью LineFeeds в его полях] (http://stackoverflow.com/questions/18206487/read-csv-file-with-linefeeds-within-its-fields) –

ответ

2

Если вам нужен конкретный ReadLine, почему бы не реализовать его?

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

Затем используйте его

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

Как об использовании

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

Затем разделить его на возврат каретки/перевод строки, как это:

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

, а затем обработки, как по линии в петле

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

Я пробовал: Regex splitter = new Regex ("\ r \ n"); string [] AllLines = splitter.Split (iFile.ReadToEnd()); В некоторой степени, что вы имеете в виду, но расщепляетесь на CRLF, но я все равно получаю случайный раскол на CR. Очень странно. –