ArrayList のように、選択した行で/から単純なテキストファイルにデータを保存およびロードすることは可能でしょうか?
2 に答える
行が(文字だけでなく)すべて同じバイト数でない限り、これは一般に、読み取り時に問題の行の前にファイル全体を読み取るか、書き込み時にファイルの残りを書き直さない限り不可能です。ファイルの途中からバイトを挿入または削除することはできません。
.NET 4 を使用している場合は、ファイルの n 行目に簡単にアクセスできます。
string line = File.ReadLines("file.txt").ElementAt(lineNumber);
ただし、前のテキストをすべて読む必要があることに注意してください。
行を置き換えるのはよりトリッキーです -最も簡単な方法 (メモリに収まるほど小さなファイルの場合) は、ファイル全体を行の配列に読み込み、行を変更してから、すべてを再度書き出すことです:
string[] lines = File.ReadAllLines("file.txt");
lines[lineNumber] = replacementLine;
File.WriteAllLines("file.txt", lines);
これを行うにはもっと効率的な方法がありますが、かなり複雑になります。
私は、ほとんどのシナリオについて、この質問に対する Skeet の回答を支持します。
追加のプログラミング作業がパフォーマンス要件によって正当化される特定のケースでは、データベースと同様のアプローチを使用できます。ファイル内の各行のオフセットを指定するインデックス構造を維持します。このインデックスは、最初に 1 回作成するだけで済み、ファイルの変更後にメモリ内で更新されます。アプリケーションの後続の実行のためにディスクに永続化される場合があります。
インデックスを初期化するためのサンプル コードを次に示します (実行はテストされていません)。
byte[] bytes = File.ReadAllBytes("source.txt");
var newlineIndexes = bytes.Select((byteValue, index) => new { byteValue, index })
.Where(p => p.byteValue == '\n' &&
p.index < bytes.Length - 1)
.Select(p => p.index + 1);
var lineIndexes = (new int[] { 0 }).Concat(newlineIndexes).ToList();