32

streamreader を使用してテキスト ファイルを読み取ります。

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
     string line = sr.ReadLine();
}

\n行区切り文字を にしないように強制したい\r。では、どうすればそれを行うことができますか?

4

9 に答える 9

33

私はGeorgeの答えのようなものを実装しますが、ファイル全体を一度にロードすることを回避する拡張メソッドとして(テストされていませんが、このようなもの):

static class ExtensionsForTextReader
{
     public static IEnumerable<string> ReadLines (this TextReader reader, char delimiter)
     {
            List<char> chars = new List<char> ();
            while (reader.Peek() >= 0)
            {
                char c = (char)reader.Read ();

                if (c == delimiter) {
                    yield return new String(chars.ToArray());
                    chars.Clear ();
                    continue;
                }

                chars.Add(c);
            }
     }
}

次に、次のように使用できます。

using (StreamReader sr = new StreamReader(FileName, Encoding.Default))
{
     foreach (var line in sr.ReadLines ('\n'))
           Console.WriteLine (line);
}
于 2011-07-11T19:38:03.867 に答える
21
string text = sr.ReadToEnd();
string[] lines = text.Split('\r');
foreach(string s in lines)
{
   // Consume
}
于 2011-07-11T19:20:20.043 に答える
5

ドキュメントによると:

http://msdn.microsoft.com/en-us/library/system.io.streamreader.readline.aspx

行は、一連の文字の後にライン フィード ("\n")、キャリッジ リターン ("\r")、またはキャリッジ リターンの直後にライン フィード ("\r\n") が続くものとして定義されます。

デフォルトでは、StreamReader の ReadLine メソッドは、\n または \r の両方またはいずれかによって行を認識します。

于 2011-07-11T19:20:45.573 に答える
4

ストリームをバイトごとに解析して分割を処理するか、/r、/n、または /r/n で分割するデフォルトの ReadLine 動作を使用する必要があります。

ストリームをバイト単位で解析する場合は、次の拡張メソッドのようなものを使用します。

 public static string ReadToChar(this StreamReader sr, char splitCharacter)
    {        
        char nextChar;
        StringBuilder line = new StringBuilder();
        while (sr.Peek() > 0)
        {               
            nextChar = (char)sr.Read();
            if (nextChar == splitCharacter) return line.ToString();
            line.Append(nextChar);
        }

        return line.Length == 0 ? null : line.ToString();
    }
于 2011-07-11T19:42:53.603 に答える
1

このコードスニペットは、「\ n」が見つかるまで、ファイルから1行を読み取ります。

using (StreamReader sr = new StreamReader(path)) 
{
     string line = string.Empty;
     while (sr.Peek() >= 0) 
     {
          char c = (char)sr.Read();
          if (c == '\n')
          {
              //end of line encountered
              Console.WriteLine(line);
              //create new line
              line = string.Empty;
          }
          else
          {
               line += (char)sr.Read();
          }
     }
}

このコードは文字ごとに読み取るため、使用可能なメモリに制約されることなく、任意の長さのファイルで機能します。

于 2011-07-11T19:33:22.157 に答える