これは非常に簡単です。
問題には3つの部分があります。
1)ファイル内の行の検索方法。これを行う唯一の方法は、ファイルから行を読み込み、その行のファイルに開始位置を記録するリストを保持することです。例:
List lineMap = new List();
lineMap.Add(0); // Line 0 starts at location 0 in the data file (just a dummy entry)
lineMap.Add(0); // Line 1 starts at location 0 in the data file
using (StreamReader sr = new StreamReader("DataFile.txt"))
{
String line;
int lineNumber = 1;
while ((line = sr.ReadLine()) != null)
lineMap.Add(sr.BaseStream.Position);
}
2)インデックスファイルを読み込んで解析します。その後
Dictionary index = new Dictionary();
using (StreamReader sr = new StreamReader("IndexFile.txt"))
{
String line;
while ((line = sr.ReadLine()) != null)
{
string[] parts = line.Split(' '); // Break the line into the name & line number
index.Add(parts[0], Convert.ToInt32(parts[1]));
}
}
は、あなたのファイルの行を見つけるために使用:
int lineNumber = index["SECTION_B";]; // Convert section name into the line number
long offsetInDataFile = lineMap[lineNumber]; // Convert line number into file offset
は次に(offsetInDataFile、SeekOrigin.Begin)シーク、DataFile.txtに新しいのFileStreamを開くの先頭に移動します(上記のように)StreamReaderを使用して行を読み込みます。
私はそれを操作し始める前にファイルを前処理しなければならないことに感謝しました。データファイルがあまりにも頻繁に変更されるので、外部データベースは私のためのオプションではありません。あなたの答えはありがたいです –
あなたはそれについて怠け者になり、最初から興味のある部分だけに前処理を行います。その時点までの0秒まで.Seek():可能です。後半の部分に興味がある場合は、どこから出発しても前処理を続けることができます。また、後で使用するためにタイムスタンプと識別可能な情報とともにインデックスを格納する(またはデータが更新されたときに完全に削除する)。 –
私はPasiの提案が好きです、ありがとう! –