古い記事
ランダムジャンプ
新しい記事
よくやってるどうってことのない処理のエッセンスだけサンプルプログラムにまとめて、未来の自分のために載せておく。1行目がラベル行になっている、ものすごくカラムが多いTSVについてプログラム中で処理するときに、カラム指定を文字列(ラベル)で行う例。

■コード (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

関連記事

この記事に言及しているこのブログ内の記事