ishiducaの日記 このページをアンテナに追加 RSSフィード

2009-10-25

[][][]tsvファイルの読み書き 12:12 tsvファイルの読み書き - ishiducaの日記 を含むブックマーク はてなブックマーク - tsvファイルの読み書き - ishiducaの日記 tsvファイルの読み書き - ishiducaの日記 のブックマークコメント

タブ(\t)区切りのファイルを読み込んで、ごにょごにょ。そんでもって書き出す。 という処理をおこなうのに2次元配列に変換しておくと都合がいいので、

  • 読み込んで、2次元配列に変換するサブルーチン
  • 2次元配列をタブ区切りのデータに直して書き込むサブルーチン

sample.tsv(便宜上スペース区切り)

初めてのPerl     3600  O'REILY
続・初めてのPerl 3200  O'REILY
BLOG HACKS       2900  O'REILY
ミニマルPerl     4200  O'REILY

file.pl

sub load{
    my $file = shift;
    -e $file or die qq(not found "$file");
    my @data;
    open my $fh, "<", $file or die qq(can not open "$file");
    eval{ flock($fh,2); };
    while( <$fh> ){
        chomp;
        my @cells = split /\t/;
        push @data, \@cells;
    }
    close $fh;
    @data;
}

sub save{
    my $file = shift;
    -e $file or warn qq(not found "$file");
    my @data;
    foreach my $cell ( @_ ){
        my $str = join "\t", @{$cell};
        push @data, "$str\n";
    }
    open my $fh, ">", $file or die qq(can not open "$file");
    eval{ flock($fh,2); };
    print $fh @data;
    close $fh;
    "saved";
}

1;

上記のサブルーチンを使って金額の安い順に並び替えたリストにして書き込む

sort.pl

#!/usr/bin/perl
use strict;
use warnings;
require 'file.pl';

my @data = &load( 'sample.tsv' );
@data = sort{ $a->[1] <=> $b->[1] }@data;

print &save( 'sort_sample.tsv', @data );

exit 0;

実行

$ perl sort.pl

結果

saved

実際にファイルの中身を見てみます。

$ cat sort_sample.tsv

出力

BLOG HACKS       2900    O'REILY
続・初めてのPerl 3200    O'REILY
初めてのPerl     3600    O'REILY
ミニマルPerl     4200    O'REILY

CamiCami2011/06/05 12:20In awe of that awnser! Really cool!

hunwfqphunwfqp2011/06/05 17:367k0Pk9 <a href="http://jabwchslvcyp.com/">jabwchslvcyp</a>

gsqsmtgsqsmt2011/06/06 22:49uwYLQj , [url=http://nskgeykqazeg.com/]nskgeykqazeg[/url], [link=http://miivgnmhdygt.com/]miivgnmhdygt[/link], http://luhgyhzekwvn.com/

qjokekbsqjokekbs2011/06/07 17:45dzx81q <a href="http://gteiwjmusklf.com/">gteiwjmusklf</a>

zghleumzghleum2011/06/09 19:17Lfux4H , [url=http://tcdptdmvajwt.com/]tcdptdmvajwt[/url], [link=http://refdedletyjd.com/]refdedletyjd[/link], http://uxobwcousuoa.com/

トラックバック - http://perl.g.hatena.ne.jp/ishiduca/20091025