• ベストアンサー

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

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

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

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