web-dev-qa-db-ja.com

テキストファイル:行ごとにC#を読み取る

それで、20行のテキストファイルがあり、各行に異なるテキストがあるとします。最初の行を含む文字列を使用できるようにしたいのですが、NextLine()を実行すると、次の行にしたい。私はこれを試しましたが、うまくいかないようです:

string CurrentLine; 
int LastLineNumber;   
Void NextLine() 
{
     System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt");
     CurrentLine = file.ReadLine(LastLineNumber + 1);
     LastLineNumber++;
}

どうすればこれを行うことができますか?前もって感謝します。

9
RevoltPlz

一般に、ファイルを開いたままにして、毎回ファイルを再度開かないように設計できるとよいでしょう。

それが実用的でない場合は、ReadLineを複数回呼び出す必要があります。

string CurrentLine; 
int LastLineNumber;   
void NextLine() 
{
    // using will make sure the file is closed
    using(System.IO.StreamReader file = new System.IO.StreamReader("c:\\test.txt"))
    {
        // Skip lines
        for (int i=0;i<LastLineNumber;++i)
            file.ReadLine();

        // Store your line
        CurrentLine = file.ReadLine();
        LastLineNumber++;
    }
}

これはFile.ReadLinesで簡略化できることに注意してください。

void NextLine() 
{
    var lines = File.ReadLines("C:\\test.txt");

    CurrentLine = lines.Skip(LastLineNumber).First();
    LastLineNumber++;
}
10
Reed Copsey

1つの単純な呼び出しで実行できます。

var fileLines = System.IO.File.ReadAllLines(fileName);

ファイルが存在することを確認し、もちろん空白行や無効な値を監視する必要がありますが、これで基本的な情報が得られます。ファイルをループするには、以下を使用できます。

foreach (var singleLine in fileLines) {
   // process "singleLine" here
}

もう1つ注意が必要なのは、メモリ内のすべてを処理するため、大きなファイルではこれを実行したくない場合です。

4
drew_w

まあ、もしあなたが本当に毎回ファイルを再び開くことを気にしないなら、あなたは使うことができます:

_CurrentLine = File.ReadLines("c:\\test.txt").Skip(LastLineNumber).First();
LastLineNumber++;
_

ただし、_File.ReadAllLines_、またはFile.ReadLines(...).ToList()を使用して、全体を一度に読むことをお勧めします。

3
Jon Skeet

ReadLineメソッドはすでにStreamReaderの次の行を読み取ります。そのため、カウンターやカスタム関数は必要ありません。 20行に達するか、ファイルが終了するまで読んでください。

2
ArthurChamz

行番号をReadLineに渡して、その特定の行を見つけることはできません。 ReadLine documentation を見ると、パラメータを受け入れていないことがわかります。

public override string ReadLine()

ファイルを操作するときは、それらをデータのstreamsとして扱う必要があります。ファイルを開くたびに、ファイルの最初のバイト/文字から開始します。

var reader = new StreamReader("c:\\test.txt");      // Starts at byte/character 0

さらに行を読みたい場合は、ストリームを開いたままにする必要があります。

using (var reader = new StreamReader("c:\\test.txt"))
{
    string line1 = reader.ReadLine();
    string line2 = reader.ReadLine();
    string line3 = reader.ReadLine();
    // etc..
}

メソッドNextLineを本当に記述したい場合は、作成したStreamReaderオブジェクトをどこかに保存し、毎回それを使用する必要があります。ややこのように:

public class MyClass : IDisposable
{
    StreamReader reader;

    public MyClass(string path)
    {
        this.reader = new StreamReader(path);
    }

    public string NextLine()
    {
        return this.reader.ReadLine();
    }

    public void Dispose()
    {
        reader.Dispose();
    }
}

ただし、ストリームをループすることをお勧めします。

using (var reader = new StreamReader("c:\\test.txt"))
{
    while (some_condition)
    {
        string line = reader.ReadLine();
        // Do something
    }
}

または、Fileクラス ReadAllLines method を使用して、すべての行を一度に取得します。

string[] lines = System.IO.File.ReadAllLines("c:\\test.txt");
for (int i = 0; i < lines.Length; i++)
{
    string line = lines[i];
    // Do something
}