■100984 / inTopicNo.2) |
Re[1]: C#でCSVの最終行だけ読み込む方法 |
□投稿者/ 魔界の仮面弁士 (3505回)-(2022/12/07(Wed) 16:34:35)
|
2022/12/07(Wed) 16:37:07 編集(投稿者)
# うぐ。元質問が消されていたけれど、 # せっかく回答をつけたので、このままにしておこう…。
■No100983 (tt さん) に返信 > ファイル容量が大きいので、 細かい話をするなら、最終行すら無い「0 バイトの CSV」に対して何を返すのか、とか、 「CSV の末尾に空行が挿入されていた場合」に空を返すのかその直前行を返すのか、とか、 そもそも「改行のない 1GB の CSV」が渡されたら 1GB の文字列を返してよいのか、とか、 諸々の課題があったりしますね。
> C#でCSVの最終行だけ読み込む方法を探しています 巨大ファイルが手元にないので、パフォーマンス検証はしていないのですが、 PowerShell の Get-Content コマンドレットに「-Tail 行数」パラメーターを渡すことで 末尾 n 行のデータを簡単に得ることができます。
// 参照設定:System.Management.Automation.dll string csv = @"E:\example.csv"; int lineCount = 1; string srcPowerShell = $"Get-Content -Path {csv} -Tail {lineCount}"; using (var invoker = new System.Management.Automation.RunspaceInvoke()) { var results = invoker.Invoke(srcPowerShell, new object[0]); foreach (var result in results) { System.Console.WriteLine(result); } }
ただし、「改行を含むデータ」が許可された CSV の場合は、 レコードの区切りの改行と、データとしての改行を区別できません。
> Fileクラス のReadAllLineメソッド以外の方法を用いたいです。 ReadAllLine ではなく ReadAllLines だとは思いますが、巨大ファイルが相手だと ReadAllLines や ReadLines でも負荷が高そうですね。
となると、適当なサイズのメモリブロックを用意して、ファイルの末尾からバイナリを取り出し、 その中で改行文字を探す(なければ次のブロックを読み取る)を繰り返すとか。 https://ja.stackoverflow.com/questions/4740/
|
|