こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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

csvファイル内
あああ,1
いいい,3
ううう,2

といったようなファイルで
「あああ」に該当するデータがあった場合
1の部分を+1にしてCSVに戻すカウンター的な物を作りたいのですが
なかなか思うように作れません。教えて頂けませんか。

すみませんが、どうぞ宜しくお願いいたします。

投稿日時 - 2010-06-09 12:25:56

QNo.5955919

すぐに回答ほしいです

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

めんどくせ~のでばっさり作り直し:
$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 は余計かもしれん.

投稿日時 - 2010-06-09 18:36:13

お礼

Tacosan様

ありがとう御座います。
おかげさまで完成しました!

それにもう少し勉強します!

投稿日時 - 2010-07-09 15:41:22

ANo.3

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(4)

ANo.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

投稿日時 - 2010-06-10 00:17:27

ANo.2

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

投稿日時 - 2010-06-09 14:50:42

補足

正直あまり理解していません。
色々なperlの説明サイトを見て使うであろうと思う記述を入れたので。

ハッシュを使わなかったのはperlの入門サイトなどを見ても
CSVを扱う時にサンプル等がなかった為です。

現在のコードはかなりデタラメかもしれませんが
やろうとしている事はkeywordでCSV内を検索して
存在すればカウントUP、なければCSVに追記です。

わかりづらくてご迷惑おかけしますがよろしくお願いいたします。

投稿日時 - 2010-06-09 15:30:55

ANo.1

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

投稿日時 - 2010-06-09 13:26:33

補足

初めて質問したので質問の仕方があまりわかってませんでした、、すみません。

現状のコードですが下記のように作ってます。
フォームから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);

投稿日時 - 2010-06-09 13:47:36

あなたにオススメの質問