助けが必要です。テキスト ファイルを読み取るメソッドを作成しています。例外が発生した場合は、テキスト ファイルに行を追加します。例: " ** "
そこで私が知る必要があるのは、peek メソッドなどのように、テキスト ファイルのすべての行を読み取ることなく、テキスト ファイル内の特定のテキスト行をチェックする方法です。
どんな助けでも大歓迎です。
前もって感謝します。
助けが必要です。テキスト ファイルを読み取るメソッドを作成しています。例外が発生した場合は、テキスト ファイルに行を追加します。例: " ** "
そこで私が知る必要があるのは、peek メソッドなどのように、テキスト ファイルのすべての行を読み取ることなく、テキスト ファイル内の特定のテキスト行をチェックする方法です。
どんな助けでも大歓迎です。
前もって感謝します。
File.ReadLines
次のものと組み合わせて使用できますAny
。
bool isExcFile = System.IO.File.ReadLines(path).Any(l => l == "**");
ReadLines メソッドと ReadAllLines メソッドの違いは次のとおりです。 ReadLines を使用すると、コレクション全体が返される前に文字列のコレクションの列挙を開始できます。ReadAllLines を使用する場合、配列にアクセスする前に、文字列の配列全体が返されるまで待機する必要があります。したがって、非常に大きなファイルを操作している場合は、ReadLines の方が効率的です。
解決策を見つけました。ファイルに追加した行は常にファイルの最後の行になるので、最後の行を読み取るメソッドを作成しました。下記参照:
public string ReadLastLine(string path)
{
string returnValue = "";
FileStream fs = new FileStream(path, FileMode.Open);
for (long pos = fs.Length - 2; pos > 0; --pos)
{
fs.Seek(pos, SeekOrigin.Begin);
StreamReader ts = new StreamReader(fs);
returnValue = ts.ReadToEnd();
int eol = returnValue .IndexOf("\n");
if (eol >= 0)
{
fs.Close();
return returnValue .Substring(eol + 1);
}
}
fs.Close();
return returnValue ;
}
私が理解していることから、いくつかのファイルを処理し、処理後にファイルのすべての行を読み取ることなく、「**」記号を含むファイルを見つけます。
ファイルの末尾に「**」を追加すると、次のようになります。
using (StreamReader sr = new StreamReader(File.OpenText(fileName)))
{
sr.BaseStream.Seek(-3, SeekOrigin.End);
string endToken = sr.ReadToEnd();
if (endToken == "**\n")
{
// if needed, go back to start of file:
sr.BaseStream.Seek(0, SeekOrigin.Begin);
// do something with the file
}
}
特別なマーカーがある場所のインデックス (コンマ区切りなど) を含む別のファイルを維持する必要があります。次に、それらのインデックスのみを読み取り、Seekメソッドを使用してファイルストリーム内のそのポイントにジャンプできます。
ファイルが比較的小さい場合、たとえば <50MB としましょう。これはやり過ぎです。それ以上に、インデックス ファイルを維持することを検討できます。基本的に、追加の IO 呼び出し (インデックス ファイルの読み取り) のパフォーマンスと、各行のファイル ストリームからの単純な読み取りのパフォーマンスを比較検討する必要があります。