人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Perlのスクリプトを募集します。主観になりますが、ズバリ度によって100〜200ptを先着の方へお送りします。

以下のようなデータを整理するスクリプトが欲しいのです。

1セル目:年月日
2セル目:時間
3セル目:商品名
4セル目:属性値A
5セル名:属性値B
6セル名:属性値C

1〜3セル目が同じなのに、4〜6目が異なる行をマージしたいです。4〜6セル目を、「それぞれ」合体させたいのです。セルごとの合体です。

例:
2015-01-05,22:31:45,ラップ大,,,破れ
2015-01-05,22:31:45,ラップ大,ラインA,,
2015-01-05,22:31:45,ラップ大,ラインA,13班,
これを…
2015-01-05,22:31:45,ラップ大,ラインA,13班,破れ

年月日と日時が一致しない行は、集約の対象外です。元データは、年月日と日時でソート済みです。合体は、単純な文字列の結合でOKです。結合順は問いません。

不足仕様があればご指摘ください。Rubyでも構いません。よろしくお願いいたします!

●質問者: Mugicha2004
●カテゴリ:コンピュータ
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● cubick
ベストアンサー

かなり雑で細かな重複チェックはしていませんが、、

$old[0] = "2015-01-05,22:31:45,ラップ大,,,破れ";
$old[1] = "2015-01-05,22:31:45,ラップ大,ラインA,,";
$old[2] = "2015-01-05,22:31:45,ラップ大,ラインA,13班,";
# @old に対してファイルからの読取等で対象のデータを入力しておく

foreach (@old) {
 @col = split(/,/);
 $key = join("|",(@col[0,1,2]) );
 
 $new{$key}[0] = $col[3] if ($new{$key}[0] eq "");;
 $new{$key}[1] = $col[4] if ($new{$key}[1] eq "");;
 $new{$key}[2] = $col[5] if ($new{$key}[2] eq "");;
}

foreach $k (keys %new) {
 $c = $k;
 $c =~ s/\|/,/g;

 print "$c,";
 printf "%s," , $new{$k}[0];
 printf "%s," , $new{$k}[1];
 printf "%s\n", $new{$k}[2];
}

Mugicha2004さんのコメント
早速のご回答、ありがとうございます。現在、移動中です。Linux環境にて、検証してみたいと思います。とてもうれしいので、挙動結果はさておき、100ptをお送りいたします。せっかくですので、もう1回答お待ちしたいと思います…

Mugicha2004さんのコメント
ポイント、お送りしました!

2 ● siachan

作ってみました。属性値が4種類以上出てくるとその分だけカラムが増えてしまいますが。

use strict;
use warnings;

my @data = <DATA>;
my %hash = ();

for my $line(@data) {
chomp $line;
my($label,$attrs) = $line =~ /^(.*?,.*?,.*?),(.*?,.*?,.*)$/;
for my $attr(split /,/,$attrs) {
next unless $attr;
$hash{$label}{$attr} = 1;
}
}

my @out = ();
for my $label(sort keys %hash) {
push @out,"$label,".join(',',sort keys %{$hash{$label}});
}

print "$_\n" for @out;

__DATA__
2015-01-05,22:31:45,ラップ大,,,破れ
2015-01-05,22:31:45,ラップ大,ラインA,,
2015-01-05,22:31:45,ラップ大,ラインA,13班,

Mugicha2004さんのコメント
ありがとうございました! 助かります。Perlは15年くらい前に触ったきりです。お二人のスクリプトをベースにしたいと思います。100pt、お送りしますね。

Mugicha2004さんのコメント
ポイント、お送りしました!
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ