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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.98663 の関連記事表示

<< 0 >>
■98663  CSVファイルの行数を簡単に得るには
□投稿者/ ゆい -(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
          :
       :
親記事 /過去ログ171より / 関連記事表示
削除チェック/

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

    ありません。


    テキストデータにおいて「行」とは「改行を表す文字までの文字列」のことです。
    従って、「改行を表す文字の数」を数えなければ、行の数はわかりませんし、そのためには「最初から読み込む」しかありません。
記事No.98663 のレス /過去ログ171より / 関連記事表示
削除チェック/

■98665  Re[1]: CSVファイルの行数を簡単に得るには
□投稿者/ 魔界の仮面弁士 -(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 行ということになります。

    この方法は「レコード間改行」と「行末改行」を区別できないため、
    両者を区別したい場合は、別途考慮が必要です。
記事No.98663 のレス /過去ログ171より / 関連記事表示
削除チェック/

■98674  Re[2]: CSVファイルの行数を簡単に得るには
□投稿者/ ゆい -(2021/12/14(Tue) 20:59:10)
    No98665 (魔界の仮面弁士 さん) に返信

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



記事No.98663 のレス / END /過去ログ171より / 関連記事表示
削除チェック/

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


    コードは簡潔かもしれませんが、「すべての行がメモリ上に一旦展開される」ので、CSV データの容量次第ではメモリを食い過ぎてパフォーマンスが落ちる可能性や、メモリ不足で OutOfMemoryException が発生する可能性はあるのでご注意を。
記事No.98663 のレス / END /過去ログ171より / 関連記事表示
削除チェック/

■98666  Re[1]: CSVファイルの行数を簡単に得るには
□投稿者/ 大谷刑部 -(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/

    このサンプルを載せてる人も書いてますが、ファイルサイズがでかいとファイル全体を文字列にするのに膨大な処理時間がかかり、
    一件ずつよんでまめにカントアップした方が結局処理時間が短い可能性があるので、
    数十万行に達する可能性があるファイルでは現実的なやり方じゃないでしょうね。
記事No.98663 のレス /過去ログ171より / 関連記事表示
削除チェック/

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

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

    バイナリをデコードする量はCSVを一度に読み込もうと逐次で読み込もうと変わらないので時間は同じなんじゃないですかね
    メモリが足りなくなってGCが頻繁に行われるようになれば時間がかかるようになるでしょうけど
    時間がかかるのが問題なのではなくてメモリが足りなくなるのが問題のような気がします
記事No.98663 のレス /過去ログ171より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -