【Perl】1行目がタイトル(ラベル)になっているTSVデータにハッシュでアクセスする
2016-03-18-2
[Programming][Perl]
よくやってるどうってことのない処理のエッセンスだけサンプルプログラムにまとめて、未来の自分のために載せておく。1行目がラベル行になっている、ものすごくカラムが多いTSVについてプログラム中で処理するときに、カラム指定を文字列(ラベル)で行う例。
■コード (read-tsv-label.pl):
■テストデータ (read-tsv-label-test.txt):
■実行例:
■コード (read-tsv-label.pl):
#!/usr/bin/env perl
# -*- coding: utf-8 -*-
use strict;
use warnings;
my @lines;
my %dat;
my @lbs; # ラベル行のラベルたち
while (<>) {
chomp;
my @F = split(/\t/, $_);
if ($. == 1) { # 1行目がラベル行
@lbs = @F;
next;
}
my %v = map { $lbs[$_] => $F[$_] } (0..$#F);
{ # 処理いろいろ
# 行番号を追加する(必要に応じて)
$v{LineNumber} = $. - 1;
# ハッシュリファレンスをリストに格納する方式
push @lines, \%v;
# 最初のカラムの内容をキーにハッシュに格納する方式
$dat{$F[0]} = \%v;
}
}
foreach my $r (@lines) { # 出力例1
print join(",", map {"$_:$r->{$_}"} sort keys %$r)."\n";
}
foreach my $k (sort keys %dat) { # 出力例2
my $r = $dat{$k};
print join(" ", $k, map {"$_:$r->{$_}"} sort keys %$r)."\n";
}
■テストデータ (read-tsv-label-test.txt):
Date Id Num Title 2016-03-14 24511 421 foobar 2016-03-15 24621 12 test 2016-03-16 24714 5 helloworld 2016-03-17 24852 360 www
■実行例:
% ./read-tsv-label.pl read-tsv-label-test.txt Date:2016-03-14,Id:24511,LineNumber:1,Num:421,Title:foobar Date:2016-03-15,Id:24621,LineNumber:2,Num:12,Title:test Date:2016-03-16,Id:24714,LineNumber:3,Num:5,Title:helloworld Date:2016-03-17,Id:24852,LineNumber:4,Num:360,Title:www 2016-03-14 Date:2016-03-14 Id:24511 LineNumber:1 Num:421 Title:foobar 2016-03-15 Date:2016-03-15 Id:24621 LineNumber:2 Num:12 Title:test 2016-03-16 Date:2016-03-16 Id:24714 LineNumber:3 Num:5 Title:helloworld 2016-03-17 Date:2016-03-17 Id:24852 LineNumber:4 Num:360 Title:www
関連記事
この記事に言及しているこのブログ内の記事
