• ベストアンサー

perlでCSVファイルのデータを操作したいのですが…

perlでCSVファイルのデータを操作したいのですが… csvファイル内 あああ,1 いいい,3 ううう,2 といったようなファイルで 「あああ」に該当するデータがあった場合 1の部分を+1にしてCSVに戻すカウンター的な物を作りたいのですが なかなか思うように作れません。教えて頂けませんか。 すみませんが、どうぞ宜しくお願いいたします。

  • Perl
  • 回答数4
  • ありがとう数15

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

めんどくせ~のでばっさり作り直し: $keyword = $in{'keyword'}; $log_file = 'log.txt'; my @keywords; my %count; open my $fh, '<', $log_file; while (<$fh>) { chomp; my ($word, $count) = split /,/; $count{$word} = $count; push @keywords, $word; } close $fh; push @keywords, $keyword unless $count{$keyword}++; open my $fh, '>', $log_file; for my $kw (@keywords) { print $fh "$kw,$count{$kw}\n"; } close $fh; くらい? 後ろの open の my は余計かもしれん.

seinosuke20
質問者

お礼

Tacosan様 ありがとう御座います。 おかげさまで完成しました! それにもう少し勉強します!

その他の回答 (3)

回答No.4

難しいことは全然考えていないけれどこんなやり方もあります。 意味を理解してから使ってくださいね。 perl -ni -e 'BEGIN{undef $/;} $wk=q/あああ/; # カウントしたい文字列 unless( s/^(${wk},)(\d+)$/$1 . ($2+1)/me ) { print $_ . "${wk},1\n"; } else{ print; } ' test.csv

参考URL:
http://www.perldoc.jp/docs/perl/5.10.0/perlop.pod
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

$logdata に読み込んでなぜ $_ を push しているのか, そしてその後でなぜ @alllog = $_; としているのか説明をお願いします. レコード間の順序が関係ないなら普通はハッシュかなぁ.

seinosuke20
質問者

補足

正直あまり理解していません。 色々なperlの説明サイトを見て使うであろうと思う記述を入れたので。 ハッシュを使わなかったのはperlの入門サイトなどを見ても CSVを扱う時にサンプル等がなかった為です。 現在のコードはかなりデタラメかもしれませんが やろうとしている事はkeywordでCSV内を検索して 存在すればカウントUP、なければCSVに追記です。 わかりづらくてご迷惑おかけしますがよろしくお願いいたします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

何がどうして「なかなか思うように作れません」なのか, 現状のコードをつけて明記してください.

seinosuke20
質問者

補足

初めて質問したので質問の仕方があまりわかってませんでした、、すみません。 現状のコードですが下記のように作ってます。 フォームからkeywordを送りCSV内にあればカウントする。 keywordがCSV内に存在しなければ追記する。 このような動作をさせたいのですが現状だと 新規のkeywordが入るとCSV内に用意していたデータが消えてしまいます。 初心者ですがよろしくお願い致します。 $keyword = $in{'keyword'}; $log_file = 'log.txt'; $flag = 0; open(OPEN, "$log_file"); while($logdata=<OPEN>){ push(@alllog,$_); @alllog = $_; chomp $logdata; ($a1,$a2) = split(/,/,$logdata); if($a1 eq $keyword){ $flag = 1; $a2++; $newlog = join(",",$a1,$a2); push @alllog,$newlog; } } close(OPEN); if(!$flag){ $newlog = "$keyword,1\n"; push @alllog,$newlog; } open(OUT, "> $log_file"); print OUT @alllog; close(OUT);

関連するQ&A

  • perlでcsvファイルを読む(ダブルコーテーション内カンマを無視したい)

    perlでCSVファイルを読み込むスクリプトを作っています。 以下のようなCSVファイルがあります。 ■CSVファイル 東京,よろしくお願いします。 大阪,はじめまして 九州,"5,000円でお願いします" カンマで区切り、以下のようにすると、"5,000円"の部分が2つに分かれてしまいます。 ($data1,$data2) = split(/,/,$all_data) 前後にダブルコーテーションがあった場合、中のカンマで区切らないような良い方法はないでしょうか? 環境: Perl 5.8.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);

  • CSVファイルの処理方法

    PerlでCSVファイルの処理をしようとしています。 CSVファイル(ここではdata1.csvとします)の中身は、A列とB列に数値が1000行程表記されています。 -5,1 -4,2 -3,3  ・  ・  ・ 作成したPerlのファイル(ここではtest1.plとします)下のようにし、 while ($_=<stdin>){ print"$_\n"; } Cygwinコマンド上で、 $ perl test1.pl <data1.csv と入力すると、CSVファイル(data1.csv)の数値がCygwinコマンド上に全て表記されます。 前置きが長かったのですが、CSVファイル(data1.csv)の3行目までの数値だけをCygwinコマンド上に表記したい場合、どのようにプログラムすればよいのですか。 お願いします。

    • ベストアンサー
    • Perl
  • CSVファイルをperlプログラムで処理する場合

    すみません、度々perl初心者のものです。 CSVファイルを1行ずつ読み込んで処理をしたい場合、 1項目内のデータの中に改行がある場合、 どのような方法で対処出来るでしょうか? 例えば "aaa,bbb,ccc ddd,eee,fff" 上記のようにcccとdddの間に改行が入ってるため 本当は1レコードのはずなのに2レコードとして 処理を行ってしまう。 perlで何かやり方はあるのでしょうか? csvを加工するのもよいのですが、データが多量に あるため、プログラム上でなんとかしたいと思うのですが。。。 すみません、宜しくお願い致します。

    • ベストアンサー
    • Perl
  • CSVファイルからdataをcgiに取り込みたい。

    初めまして、perl全くの初心者であります。 なにとぞよろしくお願いいたします。 CSVファイルからdataをcgiに取り込みたいのですが、他者の質問を参考にしたのですがなかなか理解しがたく、みなさまのお力を拝借したいわけです。 例) 以下のようなcsvがあるとします。 data.csv  テレビ,tv.jpg,安いよ,39800  ビデオ,vtr.jpg,高機能,29800  洗濯機,sen.jpg,2層式,128000 この場合、  $sina[x] $jpg[x] $pr[x] $kakaku[x] みたいに、各データを当てはめたいのですが、どのようにすればいいのでしょうか? また、データ記載の商品の数(例では3です)を求めたいのですが。

    • ベストアンサー
    • CGI
  • CSVファイル操作

    VBでCSVを操作しているのですが、わからないことがあるので教えてください。 1.CSVファイル(改行区切り)のレコード数を取得するにはどうすればいいですか? 2.CSVファイル(改行区切り)の最初のレコードのみ削除するにはどうすればいいですか?   また、レコードを指定して削除することはできますか? 3.CSVファイル(改行区切り)のレコードを指定して内容を変更することはできますか? Windows XP , VB6

  • PerlでのCSV書き込みについて質問です。

    perl初心者です。 perlで投票のプログラミングを作ってるのですが、 どうもうまく動きません。 やりたいことは ・投票されたら  1)csvを読み込む  2)該当するNOのカウントをアップ  3)csvに書き込む という単純なことなのですが、 投票してもカウンタは0のままになってしまいます。 書き込み部分のプログラムが間違っているとは思うのですが 何が間違っているのかがどうしてもわかりません。 どなたかお知恵を貸してくださいm(__)m プログラムは下記のようになっています。 ================= foreach my $key (@key) { $val = $in{$key}; $in{$key} = &Jcode::convert(\$val, 'sjis'); } # データオープン open(DAT,"+< $datfile"); flock(DAT, 2); my @data; while (<DAT>) { push(@data,$_); if (eof) { last; } } # データ書き込み truncate(DAT, 0); seek(DAT, 0, 0); my $i=1 while (i<11){ my ($no,$name,$count) = split(/,/, $data[$i]); if($val eq $no){$count++;} if (eof) { last; } $i++; print DAT "$no,$name,$count,\n"; } close(DAT); ================= どうぞよろしくお願いします。

    • ベストアンサー
    • Perl
  • Perlでのファイル内データ処理方法について

    プログラミングを始めたばかりです。 Cygwin上でPerlを行っています。 下に示すように、計算プログラムの中にデータを記入し、そのデータを処理することは出来たのですが、外部のファイルを読みそのデータを処理する方法が分かりません。 # y = ax + bを求める @x=(1,2,3); @y=(1,4,9); for($i=0;$i<$n;$i++){ $A = $A + ($y[$i] * $y[$i]); $B = $B + ($x[$i] * $x[$i]);   ・   ・   ・ $a=・・・ $b=・・・ print("a=$a,b=$b"); パールファイル(.pl)内に @x=(1,2,3); @y=(1,4,9); のように記載すると、データが変わるたびにファイル内の数値を入れ替えないといけないと思うのですが、cygwinのウィンドウに、 $ ./lesson.pl 10 <data1.csv のように入力しEnterすると、ファイル内の数値を入れ替えないで指定したファイル(ここではdata1.csv)のデータが処理されると思うのですが、その場合パールファイルをどのように記述すればよいのでしょうか。また、cygwinのウィンドウにどのように入力すればよいのでしょうか。 よろしくお願いします。

    • ベストアンサー
    • Perl
  • CSVファイルの中身

    いつもお世話になってます。 かなり初歩的な質問です! PerlでCSVファイルを読み込ませるプログラムがあるんですが、CSVファイルにはどうやってデータを格納すればいいのかわかりません。 プログラムはサイトを読み込ませるものらしいので、おそらくURLを記述すればいいんだとは思うんですが…。 よろしくお願いします。

  • HTMLファイルをCSVファイルへ

    はじめまして。 HTMLファイルのタグ以外のデータを最終的にCSVファイル(カンマ区切り)に 落としたいのですが、このプログラムをPerlで書かなければなりません。 ツリー構造を利用?して書くと言われましたが、良くわかりません。 Perlも始めたばかりなので、わかる方は教えてください。