• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:CSVファイルのデータの行数を取得したい)

CSVファイルの行数を取得する方法

fumufumu_2006の回答

  • ベストアンサー
回答No.1

>data.csvにデータがあるのに というのは、「そのファイルがあるはずだ」なのか「@arrayに読み込んでいるのに」なのかで違うんではないでしょうか・・・ 下を実行してみてください。 「オープンエラー」なら、無いか場所が違うか名前が違うか、"./data.csv"で、カレントフォルダも指定しなくてはいけないのか・・・ エラーにならずに-1なら・・・ 結果を教えてください。 ちなみに、scalar(@array)で要素数はわかります、多分。 #!/usr/local/bin/perl use strict; use CGI::Carp qw(fatalsToBrowser); use CGI; #表示用設定 my $query = new CGI; print $query->header(-charset=>'Shift_JIS'); if(open(FH,"data.csv")){ my @array = <FH>; my $count = $#array; close(FH); print "count-1=$count<br>\n"; print "count=".scalar(@array)."<br>\n"; print "array0=$array[0]<br>\n"; }else{ print"オープンエラー"; exit; }

Stiltzkin
質問者

お礼

大変ご丁寧に回答をいただきまして、ありがとうございました。 教えていただいたスクリプトを実行してみたところ、配列の要素数や1行目のデータなども表示されました。したがって、@arrayにcsvファイルのデータが読み込まれていることが確認できました。 また、教えていただいたスクリプトを参考にコードを書き直してみたところ、無事動作しました。 いろいろ試してできなかったことだったのですが、無事解決をしました。本当に助かりました。どうもありがとうございました。

関連するQ&A

  • CSVデータの項目名からファイル名を付ける

    CSVデータからHTML拡張子で書きだすCGIを作成してます。 参考になるサブルーチンをネットで見つけたのですが、行の上から順に001.html・・・・のファイル名になり、CSVデータの項目にあるデータでファイル名を付けたいと思いますが、どのように処理したらよいかわかりません。アドバイス願います。 -------------------------------------------------------------- サンプルのCSVデータ(2行目のファイル名をファイル名につけたいです。) タイトル,ファイル名,会社名,担当者,URL 山ちゃん,yamadaya,山田屋,山田,http://www.oooxxx.oo 最上ちゃん,mogami,最上商店,最上,http://www.oooxxx.oo 南ちゃん,minami,南喫茶,南,http://www.oooxxx.oo -------------------------------------------------------------- コード: $list = join('',@csv); @list = split(/\n/, $list); for($count=1;$count<@list;$count++){ $html = $template; $filename = sprintf("%03d.html",$count); @listinfo = split(/\,/,$list[$count]); for($cnt=0;$cnt<@listinfo;$cnt++){ $no = sprintf("<!--%02d-->",$cnt); $html =~ s/$no/$listinfo[${cnt}]/g; } flock(FH, LOCK_EX); open(FH,">$filename"); print FH $html; close(FH); flock(FH, LOCK_NB); }

  • while(<ハンドラ>) {} で行数をカウント

    こんにちは。 掲示板をperlで作るという課題に取り組んでいるのですが、下記の部分の 動きだけがどうしても期待する動作がえられず、困っています。 なにか試した方が良い事がありましたら、ご指摘いただけないでしょうか。 プログラムの説明: POST されたコメントを data.dat に追記していくプログラムです。 ファイルハンドラから一行づつ読み込んで、行数を $count でカウントし、 『X行目&&コメント』のようにコメントの先頭に行数を表示します。 #!/usr/bin/perl $myfile = 'data.dat'; (省略) sub piyo{ open(HOGE, ">> $myfile"); flock(HOGE, 2); my $count = 1; while(<HOGE>){ $count++; }; print HOGE "$count行目&&in{'comment'}\n"; close(HOGE); }; data.dat の期待する結果は下記です。 1行目&&コメント 2行目&&コメント 3行目&&コメント ..... 実際に data.dat に書き込まれた結果は下記でした。 1行目&&コメント 1行目&&コメント 1行目&&コメント ..... 試した事1: open(HOGE, ">> $myfile"); を open(HOGE, "+>> $myfile"); した。 試した事2: while(<HOGE>){ $count = $count + 1; }; とした。 どちらでも結果に違いがありませんでした。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVデータの行数カウントをしたいのですが・・

    CSVデータの行数カウントをしたいのですが・・ どうしたらよいでしょうか? 目的は <tr> <td><?=$奇数行のデータ?></td> <td><?=$偶数行のデータ?></td> </tr> のように 2列のテーブルに奇数行と偶数行を出力させるためです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 複数のCSVを一度にダウンロード

    いつもお世話になります。 WebサーバーのCSVをダウンロードするのに次のようなCCGIを使っています。 ***************************************** #! /usr/bin/perl open FH, "./data.csv"; print <<__EOH__; Content-Type: text/download; name="data.csv" Content-Disposition: inline; filename="data.csv" __EOH__ print <FH>; close FH; ***************************************** 1つだけならこれでOKなんですが、例えばdata1.csv、data2.csv、data3.csvという3つのCSVをダウンロードさせるにはどのようにコーディングすればよいのでしょう?

    • ベストアンサー
    • Perl
  • CSVデータの同じファイルに上書きするには。

    CSV形式でデータdata.csvが書いてあります。プログラムを実行して、そのファイルの$data[4]の値が5という数字だった場合は、そこのセルだけ"解除"という文字に置き換えて(ほかに入ってる値ははそのまま)data.csvに上書きしたいのですが、どうもうまくいきません。したのように記述したのですが、どこが間違っているのかがわかりません。。どなたか教えてください。よろしくおねがいします。 #!/usr/bin/perl $file='data.csv'; open(FILE, "$file"); while(<FILE>){ @data = split(/,/, $_); } close(FILE); if($data[4] eq "5"){$data[4] = "解除";} open(OUT, ">$file"); print OUT @data; close(OUT);

  • csvデータをひとつのテーブルに読み込みたい

    Perlを勉強し始めた初心者です。 Perlでスケジュール管理ができるものを作っています。 月ごとのカレンダーではなく、1日単位で画面が切り替わるようにしています。 9:00~21:30までの時間を30分ごとに区切ったタイムテーブルに、 csvに保存している予定データを表示させたいのですが、うまくいきません。 かなり省略していますが、下記のようなソースです。 ************************************************************************ for($i=9; $i<=21; $i++) #時間の数だけテーブルをループさせます。 { open(IN,"data.csv"); while (<IN>) { #ここにテーブルタグを書き、csvの予定データを読み込みます。 } close(IN); } ************************************************************************ 上のようにすると、csvファイルにある予定データの数だけテーブルを 繰り返してしまいます。もし予定データが5件あるとしたら、9:00の行が5つ、 9:30の行が5つ、と作成されてしまいます。 テーブルを重複させずにcsvのデータを表示させるにはどうしたら良いのでしょうか? 根本的な考え方が間違っているのでしょうか? わかりにくい質問になってしまいましたが、アドバイス頂ければ嬉しく思います。

  • 巨大ファイルの行をを逆順に並べ替えたい>perl

    下記、perlスクリプトで通常は逆順に並べ替えることができると思うのですが、ファイルの行数が1000万行程度あり、実行すると、PCのメモリを食いつぶしてしまいまともに動作しません。 どのようにすればよいでしょうか? もしくは、これに相当するようなフリーソフトはありますか? ご存知の方教えてください。 宜しくお願い致します。 #!/usr/local/bin/perl open(OUT, "1all.txt"); open (FH , ">out_all.txt"); print FH foreach( reverse <OUT> ); close(FH); close(OUT);

    • ベストアンサー
    • Perl
  • ADOによるCSVファイルからのデータ取得

    EXCELVBAを用いて、ADODB.CONNECTIONによりデータを取得しようと思い、ネットで調べた プログラムを使ってみたのですが、途中のレコードまでしか取得できませんでした。 ちなみに、データを取得しようと思っているもとのCSVファイルのサイズは10GB超、レコード数は 800万行程度あります。 これが、数十MB程度のファイルだと問題なかったのですが、レコード数などに制限はあるのでしょうか。 ご教示いただけますと幸いです。 用いたマクロの構文は以下のとおりです。 Dim con As New ADODB.Connection Dim connectionString As String Dim csvFilePath As String Dim rs As ADODB.Recordset Dim colNo As Long Dim fileNumber As Long Dim Buffer As String 'CSVファイルが置かれているフォルダ csvFilePath = E:\ connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _ & "Data Source=" & csvFilePath & ";" _ & "Extended Properties=""Text;HDR=NO;FMT=Delimited""" 'コネクションオープン con.Open connectionString 'ここでSQL文によりレコードを取得します。 Set rs = con.Execute("SELECT COUNT(*) FROM XXX.CSV") fileNumber = FreeFile Open OutputFolder & Application.PathSeparator & OutputFile For Output As #fileNumber Buffer = "" ’ヘッダーの出力 For colNo = 0 To rs.Fields.Count - 1 If Buffer <> "" Then Buffer = Buffer & "," End If Buffer = Buffer & rs.Fields(colNo).Name Next Print #fileNumber, Buffer ’データの出力 Do While rs.EOF = False Buffer = "" For colNo = 0 To rs.Fields.Count - 1 If Buffer <> "" Then Buffer = Buffer & "," End If Buffer = Buffer & rs.Fields(colNo).Value Next Print #fileNumber, Buffer '次のレコード rs.MoveNext Loop Close #fileNumber 'クローズ con.Close Set rs = Nothing Set con = Nothing End Sub

  • perlでcsvファイルから複数行を抽出したい

    プログラミング初心者です。 お知恵をお貸しください。 perlでcsvファイルから任意の複数行を、コマンドライン引数を使って抜き出したいです。 1行だけだとうまくいきますが、以下ではすべてのcsvデータが出力されてしまいます。 ----------------------getcsv.pl ここから---------------------- #!/usr/bin/perl -- use strict; use warnings; open(IN, "<adata.csv"); open (OUT, ">$bdata.csv"); while(<IN>){ if($. == $ARGV[0] || $ARGV[1] || $ARGV[2] || $ARGV[3]) { print OUT $_; } } close(IN); close (OUT); ----------------------getcsv.pl ここまで---------------------- ----------------------コマンド ここから---------------------- perl getcsv.pl 1 3 8 10 ----------------------コマンド ここまで---------------------- よろしくお願いします。

    • ベストアンサー
    • Perl
  • 圧縮ファイルの取得

    http://okwave.jp/qa/q8823112.html こちらで質問させていただいたように、/public_html/file.zipではなく、/file.zipの ファイルをダウンロードさせるために以下の方法を取りました。 print "Content-type: application/x-tar\n\n"; open( FH, "$filename" ); binmode FH; binmode STDOUT; print <FH>; close( FH ); この方法では、ブラウザで表示させてダウンロードできるようになったのですが、 これをperlで、wgetか、何かを使って取得したいと考えています。 ところが、wgetで試したところ、zipファイルではなく、cgiページ自体のソースの取得になってしまいました。 zipファイルを取得するにはどのようにしたらよいのでしょうか。 perlの知識があまりないので、どうしても解決できません。 宜しければ具体的に書き方を教えていただけると大変助かります。どうぞよろしくお願いいたします。

    • ベストアンサー
    • Perl