2016-05-10 68 views
0

我有一個非常大的以逗號分隔的文本文件。如前所述,每個字段都用逗號分隔,並用引號(所有字符串)包圍。問題是某些字段包含該字段中多行的CR。所以當我做一個ReadLine時,它停在那個CR上。如果我能告訴它只停止在CRLF組合上,那將是很好的。用crlf行分隔符讀取BIG文本文件的最佳方法

有沒有人有任何活潑的方法來做到這一點?這些文件可能非常大。

+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

[在其字段中使用LineFeeds讀取Csv文件]可能重複(http://stackoverflow.com/questions/18206487/read-csv-file-with-linefeeds-withinits-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上發生分裂。很奇怪。 –

相關問題