- ベストアンサー
perlでCSVファイルのデータを操作したいのですが…
perlでCSVファイルのデータを操作したいのですが… csvファイル内 あああ,1 いいい,3 ううう,2 といったようなファイルで 「あああ」に該当するデータがあった場合 1の部分を+1にしてCSVに戻すカウンター的な物を作りたいのですが なかなか思うように作れません。教えて頂けませんか。 すみませんが、どうぞ宜しくお願いいたします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
めんどくせ~のでばっさり作り直し: $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 は余計かもしれん.
その他の回答 (3)
- tsuduki123
- ベストアンサー率32% (21/65)
難しいことは全然考えていないけれどこんなやり方もあります。 意味を理解してから使ってくださいね。 perl -ni -e 'BEGIN{undef $/;} $wk=q/あああ/; # カウントしたい文字列 unless( s/^(${wk},)(\d+)$/$1 . ($2+1)/me ) { print $_ . "${wk},1\n"; } else{ print; } ' test.csv
- Tacosan
- ベストアンサー率23% (3656/15482)
$logdata に読み込んでなぜ $_ を push しているのか, そしてその後でなぜ @alllog = $_; としているのか説明をお願いします. レコード間の順序が関係ないなら普通はハッシュかなぁ.
補足
正直あまり理解していません。 色々なperlの説明サイトを見て使うであろうと思う記述を入れたので。 ハッシュを使わなかったのはperlの入門サイトなどを見ても CSVを扱う時にサンプル等がなかった為です。 現在のコードはかなりデタラメかもしれませんが やろうとしている事はkeywordでCSV内を検索して 存在すればカウントUP、なければCSVに追記です。 わかりづらくてご迷惑おかけしますがよろしくお願いいたします。
- Tacosan
- ベストアンサー率23% (3656/15482)
何がどうして「なかなか思うように作れません」なのか, 現状のコードをつけて明記してください.
補足
初めて質問したので質問の仕方があまりわかってませんでした、、すみません。 現状のコードですが下記のように作ってます。 フォームから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);
お礼
Tacosan様 ありがとう御座います。 おかげさまで完成しました! それにもう少し勉強します!