C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: C#でCSVの最終行だけ読み込む方法


(過去ログ 176 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■100983 / inTopicNo.1)  C#でCSVの最終行を読み込む方法
  
□投稿者/ tt (1回)-(2022/12/07(Wed) 15:25:24)

分類:[C#] 

2022/12/07(Wed) 17:21:29 編集(投稿者)

C#でCSVの最終行を読み込む方法を探しています

引用返信 編集キー/
■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/
引用返信 編集キー/
■100985 / inTopicNo.3)  Re[2]: C#でCSVの最終行だけ読み込む方法
□投稿者/ tt (2回)-(2022/12/07(Wed) 17:23:25)
2022/12/07(Wed) 17:24:22 編集(投稿者)
2022/12/07(Wed) 17:24:20 編集(投稿者)

No100984 (魔界の仮面弁士 さん) に返信

質問を消してしまい申し訳ございませんでした。
何とか解決できました。
魔界の仮面弁士さん、ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -