以下のようなデータを整理するスクリプトが欲しいのです。
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でも構いません。よろしくお願いいたします!
かなり雑で細かな重複チェックはしていませんが、、
$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]; }
かなり雑で細かな重複チェックはしていませんが、、
$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]; }
早速のご回答、ありがとうございます。現在、移動中です。Linux環境にて、検証してみたいと思います。とてもうれしいので、挙動結果はさておき、100ptをお送りいたします。せっかくですので、もう1回答お待ちしたいと思います…
ポイント、お送りしました!
作ってみました。属性値が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班,
ありがとうございました! 助かります。Perlは15年くらい前に触ったきりです。お二人のスクリプトをベースにしたいと思います。100pt、お送りしますね。
ポイント、お送りしました!
早速のご回答、ありがとうございます。現在、移動中です。Linux環境にて、検証してみたいと思います。とてもうれしいので、挙動結果はさておき、100ptをお送りいたします。せっかくですので、もう1回答お待ちしたいと思います…
2016/03/25 20:57:35ポイント、お送りしました!
2016/03/26 06:59:34