• ベストアンサー

batファイルでファイルの件数取得

batファイルでカレントフォルダ内のCSVファイルの件数を取得したく、 以下のbatファイルを作成しましたが、件数が多いと若干のズレがでます。 どこがダメなのでしょうか?ご教授お願いします。 for /f "usebackq" 55i in(`dir /B /S *.csv`) do ( SET /P<NUL=%%i: type %%i | find /c /v "" )

質問者が選んだベストアンサー

  • ベストアンサー
  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.4

何度もすみません。 ファイルが大きいようでしたら、1行ずつ読み込んで、行数をカウントしています。 大きなファイルで行数が多く、なおかつ、ファイルも多い場合は、時間が・・・ Option Explicit Dim c, f, n, r, s, t Set s = CreateObject("Scripting.FileSystemObject") Set f = s.GetFolder(".") For Each n In f.Files If LCase(s.GetExtensionName(n.Name)) = "csv" Then Set t = s.OpenTextFile(n.Name, 1) c = 0 Do Until t.AtEndOfStream r = t.ReadLine c = c + 1 Loop MsgBox(n.Name & vbCrLf & c) t.Close Set t = Nothing End If Next Set f = Nothing Set s = Nothing

chiroru0705
質問者

お礼

完璧です! 実際100MGくらいのファイルで件数が正確でなかったんですが、 このスクリプトですと正確にカウントできました。 大変ありがとうございました。

その他の回答 (3)

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.3

回答No.2です。 やはり、申し訳ございませんでした。 Option Explicit Dim c, f, n, s, t Set s = CreateObject("Scripting.FileSystemObject") Set f = s.GetFolder(".") For Each n In f.Files If LCase(s.GetExtensionName(n.Name)) = "csv" Then Set t = s.OpenTextFile(n.Name, 1) c = Split(t.ReadAll, vbCrLf) MsgBox(n.Name & vbCrLf & UBound(c)) t.Close Set t = Nothing End If Next Set f = Nothing Set s = Nothing 一応、簡単な説明です。 Set t = s.OpenTextFile(n.Name, 1) 「csv」ファイルを見つけると、読み込み専用で開いています。 c = Split(t.ReadAll, vbCrLf) それを、「ReadAll」で、一気に読み込んでいます(1行ずつなどではなく、一気にすべて読み込んでいます)。 したがって、あまり大きなファイルは避けてください。 一応、「VBScript」は、2GBまで対応しているとのことですが・・・ ということは、「改行」が区切り記号として使えるので、「Split()」を使って配列変数に格納しています。 「Split()」というのは、区切り文字(通常は「,」ですが、今回は「改行=vbCrLf」)を使って、文字列を分割し、配列変数に入れる関数です。 たとえば、読み込んだ1行が、「1,2,3」で、「,」を区切り記号にすれば、「c(0) = 1」、「c(1) = 2」、「c(2) = 3」となるわけです。 この配列変数の添え字の最大値を得るのは、「UBound()」です。 したがって、上の例ですと、「UBound(c)」では、最大値は(「()」)の中の数値は、「2」なので、通常は、「UBound() + 1」が件数なのですが、今回は「改行」を区切りしていますので、「UBound(c)」=「件数」となります。

  • Prome_Lin
  • ベストアンサー率42% (201/470)
回答No.2

「VBScript」での参加ですので、完全に無視してください。 以下のプログラムをメモ帳かテキストエディタに貼り付け、「~.vbs」(「~」の部分は何でもかまいません)という名前で保存してください。 できたプログラムファイルを、これから調べたい「csv」ファイルの存在するフォルダに放り込んで、ダブルクリック(「シングルクリック」→「Enter」の方が確実)で実行してください。 Option Explicit Dim c, n, s, f Set s = CreateObject("Scripting.FileSystemObject") Set f = s.GetFolder(".") c = 0 For Each n In f.Files If LCase(s.GetExtensionName(n.Name)) = "csv" Then c = c + 1 End If Next MsgBox(c) Set f = Nothing Set s = Nothing 多分、お分かりになると思いますが、簡単な説明です。 Option Explicit 「厳密に」というような意味ですが、気にしないでください。 Set s = CreateObject("Scripting.FileSystemObject") ファイルやフォルダを扱えるようにしています。 Set f = s.GetFolder(".") プログラムファイル(「~.vbs」自身)が存在するフォルダを取得しています。 c = 0 カウント用。 For Each n In f.Files フォルダ内の全てのファイルを1つずつ処理。 If LCase(s.GetExtensionName(n.Name)) = "csv" Then 拡張子が「csv」だったら、 c = c + 1 MsgBox(c) 最後に「csv」の数を、表示しています。

chiroru0705
質問者

お礼

早々にお返事ありがとうございました。 CSVファイルの中身の行数も求められると助かります。

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

55i は %%i のタイプミスですよね。 他にはおかしな点は無いですが、「件数が多いと若干のズレ」というのは具体的にはどんなものでしょうか? あと、普通は、 find /c /v "" < %%i ですね。

chiroru0705
質問者

補足

48万件の時、1件多くカウントしました。 また、19万件の時、20件多くカウントしました。 件数が多すぎると正確にカウントされないのでしょうか? 5万件くらいはOKでした。

関連するQ&A