75

は存在しますが、存在しFile.ReadAllLinesませんStream.ReadAllLines

using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
    // Would prefer string[] result = reader.ReadAllLines();
    string result = reader.ReadToEnd();
}

これを行う方法はありますか、それともファイルを 1 行ずつ手動でループする必要がありますか?

4

6 に答える 6

119

次のように、行ごとに読み取るメソッドを作成できます。

public IEnumerable<string> ReadLines(Func<Stream> streamProvider,
                                     Encoding encoding)
{
    using (var stream = streamProvider())
    using (var reader = new StreamReader(stream, encoding))
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

次に、次のように呼び出します。

var lines = ReadLines(() => Assembly.GetExecutingAssembly()
                                    .GetManifestResourceStream(resourceName),
                      Encoding.UTF8)
                .ToList();

部分は、Func<>複数回読み取るときに対処し、ストリームを不必要に開いたままにしないようにすることです。もちろん、そのコードをメソッドに簡単にまとめることができます。

一度にすべてをメモリに入れる必要がない場合は、ToList...

于 2012-11-09T17:27:03.607 に答える
47

次の.EndOfStream行が null でないかどうかを確認する代わりに、プロパティをループで使用できます。

List<string> lines = new List<string>();

using (StreamReader reader = new StreamReader("example.txt"))
{
    while(!reader.EndOfStream)
    {
        lines.Add(reader.ReadLine());
    }
}
于 2013-12-12T16:04:43.327 に答える
7
using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
    // Would prefer string[] result = reader.ReadAllLines();
    string[] result = reader.ReadToEnd().Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);
}
于 2012-11-09T17:27:03.890 に答える
6

ここでの使用Split

reader
   .ReadToEnd()
   .Split(Environment.NewLine.ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

と同等ではありませんReadLineStreamReader.csのソースを見るとReadLine、行末記号\r、\n、および \r\n が正しく処理されていることがわかります。行末記号が \r\n の場合、余分な空の文字列を返しません。これは DOS/Windows で一般的です。\r に続く \n を 2 つの別個の区切り文字として「認識」(解析) し、空の文字列を返します。ReadLineSplit

上記のコードの「StringSplitOptions.RemoveEmptyEntries」は、これらの空の文字列を削除しますが、入力に表示される空の行も削除します。

したがって、入力 line1\r \r line3\r に対して ReadLine3 行が返されます。2番目は空です。 Split4 つの文字列を作成します。(最後の \r の後に追加の文字列があります。) 次に、2 番目と 4 番目を削除します。

Split「後置」で区切られたテキスト行の解析にはあまり適していないことに注意してください。つまり、トークンの後にデリミタが表示されます。WhileSplitは、区切り記号がトークン間に現れるインフィックスに適しています。a,b,c と line1\r,line2,line3\r の違いです。これらの入力に対して、Splitそれぞれ 3 つの文字列または 4 つの文字列を返します。

于 2014-05-22T03:35:22.120 に答える
1

次の拡張メソッドを使用します。

public static class Extensions
{
    public static IEnumerable<string> ReadAllLines(this StreamReader reader)
    {
        string line;
        while ((line = reader.ReadLine()) != null)
        {
            yield return line;
        }
    }
}

目的のコードに到達することは可能です:

using (Stream stream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Test_Resources.Resources.Accounts.txt"))
using (StreamReader reader = new StreamReader(stream))
{
    string[] result = reader.ReadAllLines().ToArray();
}
于 2018-12-22T15:41:03.510 に答える
0

StreamReader を使用する場合は、はい、ReadLine を使用して StreamReader をループし、行ごとに読み取る必要があります。

そんな感じ:

string line;

using (StreamReader reader = new StreamReader(stream))
{
    while ((line = reader.ReadLine()) != null)
    {   
        Console.WriteLine(line); 
    }
}

または試す

using (StreamReader reader = new StreamReader("file.txt"))
    {

       string[] content = reader.ReadToEnd().Replace("\n","").Split('\t');
    }
于 2012-11-09T17:29:18.080 に答える