ここから本文です

Perlで複数の行の統合についての質問です

asgard0522さん

2011/12/109:57:31

Perlで複数の行の統合についての質問です

PerlでCSVファイルを処理するときに、id,key1,key2,...となっているようなファイルにおいて
idが重複する複数の行が存在する場合、それらを1行にまとめるにはどうすればいいでしょうか?

(例)
山田,和食,寿司
山田,和食,鍋

山田,和食,寿司,和食,鍋

よろしくお願いします。

閲覧数:
603
回答数:
3
お礼:
500枚

違反報告

ベストアンサーに選ばれた回答

namboku_888さん

2011/12/122:03:35

キーブレイク処理で行う方法もあります。

CSVファイルの最初の項目(id)をキーとし、キーが変わるまで
key1,key2...のデータを出力用の配列"@OUT"に追加します。

キーが変わったら、それまでのキー($sv_key)と出力用の
配列"@OUT"を出力します。

下記のスクリプトの"input.txt"が入力用のCSVファイルで、
"output.txt"が出力したCSVファイルになります。

open(IN1,"input.txt");
open(OUT1,">output.txt");

$in1_key = undef; #入力キー
@out = (); #出力データの配列
$sv_key = undef; #保存した入力キー

while (<IN1>) {
chomp($_);
($in1_key,@data) = split(",",$_,-1);

if (($sv_key ne undef)
&& ($sv_key ne $in1_key)) {
$out1 = join(",",$sv_key,@out);
print OUT1 "$out1\n";
@out = ();
}
$sv_key = $in1_key;
push(@out, @data);
}
close(IN1);
close(OUT1);

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

elekingmanさん

編集あり2011/12/112:58:30

山田の位置を覚えておく方式ですw
順番を保持しているので最初に出現した位置にまとまるというメリット?も一応あります。

use CGI ':all';
use Data::Dumper;
my (@data, %id);
for(<DATA>){
chomp;
my ($name, @row) = split/,/;
if(! defined $id{$name}){# 初めて出た山田のrow番号を記憶
$id{$name} = @data ;
$data[$id{$name}] = [$name];
}
push @{$data[$id{$name}]}, @row;
}
print header(-charset=>'UTF-8'), pre(Dumper(\%id, \@data));

__END__
山田,和食,寿司
山田,和食,鍋
山本,焼肉,そば
山下,洋食,酒
山本,酒,寿司

2011/12/111:15:09

Webシステム開発を仕事にしている井上と申します。
こんな感じではいかがでしょうか?

---
#ファイルは開いておく

my %index;
while (<CSV>){

s/[\r\n]*$//; #改行を除く
my($key, $list) = split(/,\s*/, $_, 2); #idとそれ以外に分ける

if (exists $index{$key} and $index{$key} ne ''){
$index{$key} .= ','.$list; #既にあればカンマを挟んでアペンド
} else {
$index{$key} = $list;
}

}

#書き出し
for (keys %index){
print CVSOUT "$key,$list\r\n";
}

---

CSVファイルが MS エクセルで編集したものなどでエンコーディングが Shift_JIS の場合、UTF-8 か EUC-JP にして処理しないと文字によってはエラーになる可能性があります。
この場合は、例えば UTF-8にするのであれば以下のようにします。

use utf8;
open (CSV, '<:encoding(cp932)', $filepath) or die "OPEN ERROR: $filepath: $!\n";

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

5文字以上入力してください

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。