を使用してテキストファイルからデータを読み取りますTextReader
TextReader reader = new StreamReader(stream);
string line;
while ((line = reader.ReadLine()) != null)
{
//.......
}
リーダーから次の行(または次の数行)を覗く必要がある場合があります。
それ、どうやったら出来るの?
編集:任意の数のピークを許可するように更新されました:
public class PeekingStreamReader : StreamReader
{
private Queue<string> _peeks;
public PeekingStreamReader(Stream stream) : base(stream)
{
_peeks = new Queue<string>();
}
public override string ReadLine()
{
if (_peeks.Count > 0)
{
var nextLine = _peeks.Dequeue();
return nextLine;
}
return base.ReadLine();
}
public string PeekReadLine()
{
var nextLine = ReadLine();
_peeks.Enqueue(nextLine);
return nextLine;
}
}
これは自分で行う必要があります。ただし、それほど難しくはありません。
public class PeekTextReader {
string lastLine;
private readonly TextReader reader;
public PeekTextReader(TextReader reader) {
this.reader = reader;
}
public string Peek() {
return lastLine ?? (lastLine = reader.ReadLine());
}
public string ReadLine() {
string res;
if (lastLine != null) {
res = lastLine;
lastLine = null;
} else {
res = reader.ReadLine();
}
return res;
}
}
一度覗くと、完全に実行するまで行がロックされたままになることに注意してくださいReadLine
。
テキストリーダーで読み取り位置を後方に移動する信頼できる方法はありません。基になるストリームをシークしようとすることはできますが、それが不可能な場合(ストリームがシークをサポートしない場合)、またはリーダー内で何らかのキャッシュが発生した場合に希望する結果が得られない場合があります。
最も現実的なアプローチは、最後の行を覚えておくことです。PeekString機能でリーダーを拡張するカスタムクラスを作成することを検討できます...しかし、他のリーダーメソッドを使用してその文字列を再読み取りする必要がある場合は、適切に実装するのが難しい場合があります。
ファイル(ReadAllLines)からすべての行を読み取ることができ、それらを簡単に操作できます。ただし、ファイルのサイズを確認してください。メモリを使いすぎる可能性があります。