PerlでCSVデータ出力の処理方法について

このQ&Aのポイント
  • Perlを使用してCSVファイルに書かれた情報を一覧表示する方法を教えてください。
  • また、特定の条件にマッチした場合にその行を表示する方法も教えてください。
  • 急ぎではありませんので、他のPerl情報サイトで調べながら回答を待ちたいと思います。
回答を見る
  • ベストアンサー

csvデータ出力

いつもお世話になっています。今回は・・・ csvファイルに書かれた情報を一覧表示するやり方は何とか判ったのですが (↓でdata.csvの情報が全て表示される) open(IN, "data.csv"); while (<IN>) { print $_; } close(IN); 一つ目のデータを参照してマッチした場合にその列を表示する。というやり方が全くわかりません; とほほさん等で調べてみたのですが、全くわかりませんでした; やりたいことは例えば・・・ csvファイルの中身の情報が 4,データ1,データ1の説明 4,データ2,データ2の説明 5,データ3,データ3の説明 5,データ4,データ4の説明 5,データ5,データ5の説明 12,データ6,データ6の説明 だとすると、一番最初の行の数字5にマッチすると 5,データ3,データ3の説明 5,データ4,データ4の説明 5,データ5,データ5の説明 を表示する。というような事がやりたいのです。 急ぎではありませんので、自分でも他のperl情報サイトで調べながら回答を待ちたいと思います。 よろしくお願いします

  • SVAHA
  • お礼率69% (16/23)
  • Perl
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • Dpop
  • ベストアンサー率51% (279/544)
回答No.1

csvの分解は簡易式です。本格的にやりたい場合には、 CSV形式の行から値のリストを取り出す http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values を参考にしてください。 open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { print $_. "\n"; } } close(IN);

SVAHA
質問者

お礼

有難う御座いました、補足で記入した事も強引な気がするやり方で出来ました^^; open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { if ((split(/,/))[0] == 12) { last ; }print $_. "\n"; } } close(IN); 補足の編集の仕方が判らなかったのでお礼として書かせて頂きます。 今度はこのデータをテーブル表示に・・・ <table><tr><td>データNO</td><td>データ</td><td>説明</td></tr> <tr> <td>5</td><td>データ5</td><td>データ5の説明</td> </tr> <tr> <td>5</td><td>データ6</td><td>データ6の説明</td> </tr> ・・・ </table> このように書き出されるように勉強します、本当に有難う御座いました

SVAHA
質問者

補足

有難う御座います!一番最初の数字にマッチしたものを取り出すことが出来ました! 書かれているURLを参考にさせていただいたのですがやっぱり判らず 全く自分がふがいなく感じております; 先ほど教えていただいたのは、マッチしたものを取りさすのだったのですが 例えば4~12の間の数字にマッチしたもの全てを取り出すのにはどう記述するべきでしょうか? 例えばデータが 4 4 5 5 5 10 ・・・ とある場合、4~10にマッチしたものを取り出すというものです これから参考に書かれたURLの場所で色々勉強したいと思います

関連するQ&A

  • 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のデータを表示させるにはどうしたら良いのでしょうか? 根本的な考え方が間違っているのでしょうか? わかりにくい質問になってしまいましたが、アドバイス頂ければ嬉しく思います。

  • csvデータをテーブル表示させる

    再び新規質問で申し訳ありません これしか方法がわからなかったもので; csvデータから最初の項目に5というものが含まれている場合 その列を表示する、というのを先ほど質問させていただいて解決に至りました。 csvデータファイルの内容 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 6,データ4,データ4の説明 ・・・ ↓ open(IN, "data.csv"); while (<IN>) { if ((split(/,/))[0] == 5) { print $_. "\n"; } } close(IN); これで最初の欄に5が含まれている列だけ表示されるのですが htmlに出力すると、そのまま下記のように表示されます 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 これでは余りにみずらいので、以下のように変更しました open(IN, "data.csv"); print "<table>"; while (<IN>) { if ((split(/,/))[0] == 5) { print "<tr><td>". $_. "</td></tr>"; } } </table> close(IN); これで少しは見やすくなったのですが・・・ ↓のように。 5,データ1,データ1の説明 5,データ2,データ2の説明 5,データ3,データ3の説明 この,で区切られた部分も</td><td>で表示したいのですがうまくいきません。 先ほど質問した時に教えていただいたURLを参照しましたがサッパリでした; 検索で、csvファイルをリストに格納して print "<table><tr>"; print "<td>$data_view[0]</td>"; print "<td>$data_view[1]</td>"; print "<td>$data_view[2]</td>"; print "</tr></table>"; と表示させれば良い、という記事をみつけたのですが これをすると 先ほど成功した最初のデータに5が一致した分だけ表示させる、という部分が機能しませんでした;; まだまだ勉強不足かとは思いますが何卒お願い致します

    • ベストアンサー
    • 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);

  • 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
  • CSVの条件出力について

    ディレクトリー内のCSVを1ファイルにするルーチンで、現在46カラム目から3桁が"000"なら出力としている判断を、5項目めが"000"ならに変更したいのですが、どのようにすればよいでしょうか? 現在の記述は下記の通りです。 if(open(OUT,">$path/$year$mon$mday$csv")){ for my $fname (sort @FTPlist){ if(open(IN,"$path/$fname")){ while (<IN>) { $sip = substr($_,46,3); if ($sip == "000") { print OUT "$_"; } } close(IN); } } close(OUT); }

    • ベストアンサー
    • Perl
  • csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい

    csvデータの開始行と最終行を全体の4分の1で区切り処理をしたい csvデータの開始行と最終行を全体の4分の1で区切り処理をしたいと思ってます。 csvファイルは20万件あります。4分の1なので1~50000件となります。 今回は50001~100000件までを行いたいのですが、先日教えていただいたwhile($lines = <IN>) ですと、最初から1件ずつ最終行まで処理をしてしまいます。 (ここから) open(OUT,">$csv"); open(IN,"$data") || &error(" $data を読み込みopen出来ません"); while($lines = <IN>) { ($seq1,$categ,$password,$imail,$cont) = split("\,", $lines); $cont .= " "; $data = "$seq1,$cont,1\n"; print OUT "$data"; $data = ""; } close IN; close OUT; (ここまで) 今回は20万件ですが、毎回このデータ量は月次ごとに変わります。 while周辺をいじるような気がしていますがどのようになるのかがわからなかったので質問いたしました。 お手数かけます。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • CSVファイルを読み込み、ファイル名を変更。

    CSVファイルを読み込み、ファイル名を変更。 使用言語はperlです。perlは初心者です。 アルゴリズムが、 CSVファイルを読み込み→2次元配列に格納→ファイル名変更 という流れになっているプログラムを作成中です。 CSVファイルの中身は あ.txt , a.txt い.txt , b.txt う.txt , c.txt です。 CSVファイルを読み込み2次元配列に格納するプログラムは以下のようにしました。 ----------------------------------- $i= 0; open IN, "sample.csv"; while (<IN>) { my @data = (); @data = split (/,/); for (0..@data) {$jdata[$i][$_] = "$data[$_]";} $i++; } close IN; ---------------------------------------- 「あ.txt」を「a.txt」に変更しようとして、この中に rename $jdata[0][0] , $jdata[0][1] ; と書いてみましたが、変換されません。 どう書けばよいのでしょうか。よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイル読み込み

    VC++でCSVファイルの読み込みを作っています。 ファイル名「abc.csv」というファイルがあり CSVファイルの内容は、 "id","food" "1","バナナ" "2","オレンジ" となっています。 ソース上はファイルをオープンして 読み込むところまでは分かりましたが、 CSVファイルのコンマの分解とその後の処理が分かりません。読み込んだ後、コンボボックスで、CSVファイルのname一覧を表示する予定でいます。 例では、バナナ     オレンジ とコンボボックスで表示して選択できるようにします。 今のソースは以下の通りです。 CStdioFile file; CString name; int flag;  if(!file.Open("abc.csv",CFile::modeRead)){ AfxMessageBox("File Open failed"); } while(flag){ if(file.ReadString(name)==FALSE) //nameにデータ読み込み break; //CSVコンマを分解 //テキスファイルで読み込み?表示? } file.Close(); //file close 初心者なので間違いだらけかもしれませんが よろしくお願いしますm(__)m

  • PerlからのCSV出力

    Perl初心者です。 PerlでOracleに接続し、結果をCSVを出力したいのですが 下記プログラムだとなにも出力されません。 Oracle10g OS:Linux *** #!/user/bin/perl # # # DBI モジュールの読み込み use DBI; #接続 my $hDb = DBI->connect("dbi:Oracle:dbname", "user/pass") or die "CONNECT ERROR $DBI::errstr"; #SELECT # $hSt = $hDb->prepare("SELECT ID,NAME FROM MASTER"); open(OUT, ">data.dat"); #実行 $nRes = $hSt->execute; #データの取得 while($raRes = $hSt->fetchrow_arrayref) { print OUT join(",", @$raRes), "\n"; } # ファイルクローズ close(OUT); $hSt->finish; $hDb->disconnect;

  • CSVファイルのデータの行数を取得したい

    こちらではいつもお世話になっています。Perlに関して、初心者ですが教えてください。 CSVファイルについて、データの存在する行数を取得したいと考えています。自分なりに考えたところでは、下記の方法で取得できるのではと思ったのですが・・・・・ open(FH,"data.csv"); @array = <FH>; $count = $#array; close(FH); data.csvは、1行目から順にデータが入っています。 これで、$countに1を足せばCSVデータの行数になるのではないかと考えています。 しかし、実際に動かしてみると、$countには、data.csvにデータがあるのに「-1」(要素なし)が返ってきます。何か間違いがあるのでしょうか。 あるいは、別にCSVデータの行数を取得する方法が他にあれば、教えていただけないでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl

専門家に質問してみよう