答えて
を、ファイルの終わりまでシークし、 '\ n'文字の逆のバイトを調べることは可能ですか?私は\ nと\ r \ nが存在することを知っています。私は次のコードを作成し、かなり簡単なファイルでテストしました。あなたはあなたが持っているファイルでこれを試すことができますか?私のソリューションは長く見えますが、最初から読んでファイル全体を書き直すよりも速いことがわかります。
public static void Truncate(string file, int lines)
{
using (FileStream fs = File.Open(file, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.None))
{
fs.Position = fs.Length;
// \n \r\n (both uses \n for lines)
const int BUFFER_SIZE = 2048;
// Start at the end until # lines have been encountered, record the position, then truncate the file
long currentPosition = fs.Position;
int linesProcessed = 0;
byte[] buffer = new byte[BUFFER_SIZE];
while (linesProcessed < linesToTruncate && currentPosition > 0)
{
int bytesRead = FillBuffer(buffer, fs);
// We now have a buffer containing the later contents of the file
for (int i = bytesRead - 1; i >= 0; i--)
{
currentPosition--;
if (buffer[i] == '\n')
{
linesProcessed++;
if (linesProcessed == linesToTruncate)
break;
}
}
}
// Truncate the file
fs.SetLength(currentPosition);
}
}
private static int FillBuffer(byte[] buffer, FileStream fs)
{
if (fs.Position == 0)
return 0;
int bytesRead = 0;
int currentByteOffset = 0;
// Calculate how many bytes of the buffer can be filled (remember that we're going in reverse)
long expectedBytesToRead = (fs.Position < buffer.Length) ? fs.Position : buffer.Length;
fs.Position -= expectedBytesToRead;
while (bytesRead < expectedBytesToRead)
{
bytesRead += fs.Read(buffer, currentByteOffset, buffer.Length - bytesRead);
currentByteOffset += bytesRead;
}
// We have to reset the position again because we moved the reader forward;
fs.Position -= bytesRead;
return bytesRead;
}
あなただけのファイルの末尾を削除することを計画しているので、すべてを書き換えるために無駄なようだ、それは大容量のファイルや。もちろん、小さなN.だ場合は特に、1があれば、誰かが望んだという議論をすることができますすべての行を削除し、最初から最後まで進む方が効率的です。
これのおかげで、明日の最初のことを試みるつもりですが、それは私が必要なものだけを行うように見えます –
美しく働いた。誰もが助けてくれてありがとう。 –
あなたは本当にINTOストリームリーダーを読んでいません。実際、あなたが求めているパターンに対しては、StreamReaderはまったく必要ありません。 System.IO.Fileは、あなたの代わりに活用できる便利な静的メソッド「ReadLines」を持っている:
IEnumerable<string> allBut = File.ReadLines(path).Reverse().Skip(5).Reverse();
以前の欠陥のあるバージョンを、バックコメントスレッド
List<string> allLines = File.ReadLines(path).ToList();
IEnumerable<string> allBut = allLines.Take(allLines.Count - 5);
あなたは、実行可能な代替手段としてファイル全体を読むことを提案しています(ReadLines.Countはファイル全体を読み込みます)? –
あなたはそうです。私はちょうどいくつかのタイムド・テストを通してそれを実行しました。 2番目の方法は、一貫して高速です。ありがとう。私の答えを更新して最初のオプションを削除します。 – xcud
+1 - 'Chr(13)' - 1バイトを探している間に、バイト単位で自分自身をバイト単位で処理する方がパフォーマンスが向上する可能性がありますが、それでも選択肢よりも速いはずです。 –
に応じて、あなたはを参照しているので、私はそれがテキストファイルであると仮定しています。
string[] lines = File.ReadAllLines(@"C:\test.txt");
それとも、本当にStreamReadersで作業する必要がある場合:あなたはちょうどあなたがそのような文字列の配列にそれらを読むことができます行を取得したい場合は、それは大きなファイルの場合
using (StreamReader reader = new StreamReader(@"C:\test.txt"))
{
while (!reader.EndOfStream)
{
Console.WriteLine(reader.ReadLine());
}
}
'StreamReader'の使用は、OPがテキストについて話していると仮定するのに十分であったはずです。 –
質問を聞いた人がStreamReaderが必要だと分かっていたのか、ファイルを読む必要があると知っていて、オンラインでクイック検索を行い、StreamReaderが表示されたのか分かりませんでした。しかし、はいあなたは正しいです – BryanJ
- 1. データベースの最初のX行を削除します
- 2. UILabelから最後の値を削除しますか?
- 3. CSVファイルから最後の行を削除する
- 4. Vi/vim - 最後の文字を含む最後の行から削除
- 5. 文字配列から最初と最後の 'X'文字を削除します
- 6. テキストファイルの最後の行を削除します。
- 7. UIAlertViewはメッセージの最後の行を削除します
- 8. コピーせずに最初の(または最後の)行をtxtファイルから削除します。
- 9. 最初にテキストファイルから1000行を削除します
- 10. 文字列の最後の空の行を削除しますか?
- 11. テキストボックスから行を削除します。
- 12. DataGridから行を削除します
- 13. SQL一意の値ごとに最後のN行から離れた行をすべて削除します
- 14. は、私は次の関数から最後の改行を削除するC
- 15. Regex - すべてのマッチを最後から削除する
- 16. Joomla 3.X - ヘッダーからツールチップスクリプトを削除しますか?
- 17. は、グリッドビューから最後の項目を削除します - >のLINQ&SQL
- 18. mysqlは最後の5行を保持し、古いレコードを削除します
- 19. テキストエディタ最後の改行文字を削除できません
- 20. R最後の単語を文字列から削除する
- 21. 最後の文字を入力から削除する
- 22. csvファイルから最後の4列を削除するbashメソッド
- 23. NSMutableStringから最後の文字を削除する
- 24. 文字列から最後の文字を削除する(Python)
- 25. タプルから最後の型を削除しようとしていません
- 26. telerikグリッドから行を削除した後のjavascript onDeletedイベント
- 27. グラフのx軸の2番目の行を削除します
- 28. フォルダ内のすべてのファイルを削除しますが、最後のファイルは削除しますか?
- 29. PHPの爆発 - 文字列の最初の部分を削除し、最後の部分を削除します
- 30. bashの各行の最後の単語を削除する
ファイルの最後からx改行を読み取り、ファイルの先頭からその位置まで読み取ります。 –
ファイルから読み込む予定のレコードには、一貫性がありますか(一般的なレコードの長さ、 '\ n'で終わる以外のもの)? –