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

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

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

Re[2]: CSVファイルの行数を簡単に得るには


(過去ログ 171 を表示中)

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

■98663 / inTopicNo.1)  CSVファイルの行数を簡単に得るには
  
□投稿者/ ゆい (36回)-(2021/12/13(Mon) 23:34:20)

分類:[VB.NET/VB2005 以降] 

VB2017です。
下のようなCSVファイルの行数を、簡単に得られるようでしたら教えてください。
最初からの読み込み以外での方法です。

2021/12/01,1254,214,2514,215,2541
2021/12/02,124,2121,251,265,3255
2021/12/03,1254,21214,6547,235,338
       :
          :

引用返信 編集キー/
■98664 / inTopicNo.2)  Re[1]: CSVファイルの行数を簡単に得るには
□投稿者/ Azulean (1212回)-(2021/12/14(Tue) 00:12:34)
No98663 (ゆい さん) に返信
> 下のようなCSVファイルの行数を、簡単に得られるようでしたら教えてください。
> 最初からの読み込み以外での方法です。

ありません。


テキストデータにおいて「行」とは「改行を表す文字までの文字列」のことです。
従って、「改行を表す文字の数」を数えなければ、行の数はわかりませんし、そのためには「最初から読み込む」しかありません。
引用返信 編集キー/
■98665 / inTopicNo.3)  Re[1]: CSVファイルの行数を簡単に得るには
□投稿者/ 魔界の仮面弁士 (3248回)-(2021/12/14(Tue) 09:17:58)
2021/12/14(Tue) 10:16:32 編集(投稿者)

No98663 (ゆい さん) に返信
> 下のようなCSVファイルの行数を、簡単に得られるようでしたら教えてください。

レコードの区切りとしての改行はあるけれど、
データ内改行は存在しない状態ですね。


固定長ならともかく、可変長テキストということになると、
仕組み的には全読みしかないので、方法としては
File.ReadLines メソッドか
File.ReadAllLines メソッドを使うのが簡単かな…。

 'Imports System.IO
 'Imports System.Text

 Dim allLines As String() = File.ReadAllLines("D:\file1.csv", Encoding.GetEncoding("Shift_JIS"))
 Label1.Text = $"{allLines.Length}行"



なおこの方法だと
 file0.csv『』
という空ファイルは 0 行として扱われます。

そして
 file1.csv『2021/12/01,1254,214,2514,215,2541{改行}』
 file2.csv『2021/12/01,1254,214,2514,215,2541』
は 1 行とみなされ、
 file3.csv『2021/12/01,1254,214,2514,215,2541{改行}2021/12/02,124,2121,251,265,3255』
 file4.csv『2021/12/01,1254,214,2514,215,2541{改行}2021/12/02,124,2121,251,265,3255{改行}』
は 2 行ということになります。

この方法は「レコード間改行」と「行末改行」を区別できないため、
両者を区別したい場合は、別途考慮が必要です。
引用返信 編集キー/
■98666 / inTopicNo.4)  Re[1]: CSVファイルの行数を簡単に得るには
□投稿者/ 大谷刑部 (158回)-(2021/12/14(Tue) 11:37:04)
No98663 (ゆい さん) に返信
> VB2017です。
> 下のようなCSVファイルの行数を、簡単に得られるようでしたら教えてください。
> 最初からの読み込み以外での方法です。
>
> 2021/12/01,1254,214,2514,215,2541
> 2021/12/02,124,2121,251,265,3255
> 2021/12/03,1254,21214,6547,235,338
>       :
>    :
>

StreamReaderのReadToEndメソッドで最後まで読んだものを、split関数で、改行コードで分離して配列のlengthを取得すれば、
ロジックのコード量は少なく件数は取れるようですけどね。

http://gunssystem.com/20170219-2/

このサンプルを載せてる人も書いてますが、ファイルサイズがでかいとファイル全体を文字列にするのに膨大な処理時間がかかり、
一件ずつよんでまめにカントアップした方が結局処理時間が短い可能性があるので、
数十万行に達する可能性があるファイルでは現実的なやり方じゃないでしょうね。

引用返信 編集キー/
■98667 / inTopicNo.5)  Re[2]: CSVファイルの行数を簡単に得るには
□投稿者/ 古谷 (23回)-(2021/12/14(Tue) 13:10:56)
File.ReadLinesならLINQが使えるので
File.ReadLines("csvファイル").Count()
で行数取得できるうえに逐次処理なのでメモリ気にしなくて済みます

No98666 (大谷刑部 さん) に返信
>
> このサンプルを載せてる人も書いてますが、ファイルサイズがでかいとファイル全体を文字列にするのに膨大な処理時間がかかり、
> 一件ずつよんでまめにカントアップした方が結局処理時間が短い可能性があるので、
> 数十万行に達する可能性があるファイルでは現実的なやり方じゃないでしょうね。
>

バイナリをデコードする量はCSVを一度に読み込もうと逐次で読み込もうと変わらないので時間は同じなんじゃないですかね
メモリが足りなくなってGCが頻繁に行われるようになれば時間がかかるようになるでしょうけど
時間がかかるのが問題なのではなくてメモリが足りなくなるのが問題のような気がします
引用返信 編集キー/
■98674 / inTopicNo.6)  Re[2]: CSVファイルの行数を簡単に得るには
□投稿者/ ゆい (37回)-(2021/12/14(Tue) 20:59:10)
No98665 (魔界の仮面弁士 さん) に返信

ありがとうございます。
上手く作動いたしました。
それにそれほど複雑なファイルでもなかったこともあります。




解決済み
引用返信 編集キー/
■98675 / inTopicNo.7)  Re[3]: CSVファイルの行数を簡単に得るには
□投稿者/ Azulean (1214回)-(2021/12/14(Tue) 21:25:42)
No98674 (ゆい さん) に返信
> ありがとうございます。
> 上手く作動いたしました。


コードは簡潔かもしれませんが、「すべての行がメモリ上に一旦展開される」ので、CSV データの容量次第ではメモリを食い過ぎてパフォーマンスが落ちる可能性や、メモリ不足で OutOfMemoryException が発生する可能性はあるのでご注意を。
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -