2017-10-20 5 views
0

C#アプリケーションでstreamreaderを使用しているときに特定の行末を取得しようとしています。streamreaderを使用して特定の行末を取得しようとしています

コード:

public static IEnumerable<string> ReadAllLines(string path) 
     { 
      if (!File.Exists(path)) return null; 
      List<string> lines = new List<string>(); 
      using (var reader = new StreamReader(path)) 
      { 
       while (!reader.EndOfStream) 
       { 
        lines.Add(reader.ReadLine(@"(\r\n|\n)")); 
       } 
      } 
      return lines.ToArray(); 
     } 

私はreader.ReadLine(@ "(\ Rの\ nは| \ n)を")がどこで見ることができます。私がreader.ReadLine()を書くと、私は問題はありませんが、私がオンラインで見つけたように行末を追加しようとすると、ReadLineに過負荷がないことがわかります。

質問:CSVファイルを正常にスキャンできるように、特定の行末を追加する方法を教えてくれる人がいますか?

更新: 私は探していた行末を追加する方法を見つけ、それを3通りの方法で試しました。しかし、私はまだいくつかの行を取得しています。それは意味をなさない。以下のコード行に問題がある人は誰でも見ることができますか?

var reader = new StreamReader(path, Encoding.Default); 
//string text = reader.ReadToEnd(); 

////// attampt 1 - this gives the best result but is still splitting an a \r in one of the fields 
//// List<string> lines = new List<string>(text.Split(new[] {"\r","\n"}, StringSplitOptions.None)); 

////// attempt 2 This worked almost identical to the option above but seemed faster. 
//var lines = Regex.Split(text, "\r\n"); 

//// attempt 3 - this split both \r and \n separately 
// List<string> lines = new List<string>(text.Split("\r\n".ToCharArray())); 

これを行う方法に関する他の提案は素晴らしいでしょう。あなたの質問へのあなたのコメントに基づいて

+0

StreamReaderは既にすべての行末を処理していませんか? [ソースコード](http://referencesource.microsoft.com/#mscorlib/system/io/streamreader.cs,a4ada5f765646068,references)は次のように言っています: "行を読み込みます。行は、キャリッジリターン( '\ r')、改行( '\ n')、改行直後の改行などがあります。 –

+1

明確にするために、行末として数えたいものを指定しようとしていますか?そして、もっと具体的には 'ReadLine'を複製しようとしていますが、行末として' \ r'を単独では許さないのですか? – Chris

+0

何が起こっているのかを説明するために、私はCSVファイルを持っています。あなたがそれをExcelに入れたら、私はZZに行く行とAZに行く行を持っています。 AZの終わりにある白い空白がZZに至り、次の行に追加され、すべてがねじ込まれます。私は、行の終わりが正しくないためだと思ったが、それらはあなたが上に述べた通りである。 – funktail1989

答えて

0

ので、ちょうど私はCSVファイルを持っている何が起こっているかを説明します。あなたがそれをExcelに入れたら、私はZZに行く行とAZに行く行を持っています。 AZの終わりにある白い空白がZZに至り、次の行に追加され、すべてがねじ込まれます。私はそれが正しいとは思っていませんでしたが、あなたが上に述べたとおりです。

String.TrimEnd()メソッド呼び出しを試してから、リストに文字列を追加してください。

public static IEnumerable<string> ReadAllLines(string path) 
{ 
    if (!File.Exists(path)) return null; 
    var lines = new List<string>(); 
    using (var reader = new StreamReader(path)) 
    { 
     while (!reader.EndOfStream) 
     { 
      // add the TrimEnd call here 
      lines.Add(reader.ReadLine().TrimEnd()); 
     } 
    } 
    return lines.ToArray(); 
} 
関連する問題