Masteries

技術的なことや仕事に関することを書いていきます.

PerlでTSVをパースする

小ネタです, 忘備録として残しておきます.

metacpan.org

PerlにはText::CSVという, CSV(Comma Separated Value)をパースするモジュールがあります. 一方で, TSV(Tab Separated Value)をパースするモジュールは, パッと見た感じいいのがなさそうでした.

解決策は以下の3つがありそうです:

split など駆使して手動でパースする

一番素朴なのは, こういう感じで split などを使って, タブを切り分ける方法でしょう($line が1行のTSVとします).

my @fields = split /\t/, $line;

...とはいえ素朴ですし, エッジケース(あるのか?)に対応していないかも... という気がするので, なるべくよしなにモジュールの力を借りたいと思うかもしれません. そういう時は...

Text::CSV_XS::TSV を使う

metacpan.org

結局のところ, CSVとTSVは似ている部分が多いので, 適切な設定をすればText::CSVでもTSVをパースできます. 例えばText::CSV_XS::TSVというCPANモジュールがあり, これはTSVを適切にパースできる設定が有効になったText::CSV_XSを提供する... というモノです.

Text::CSVのオプションを変更する

さて, Text::CSV_XS::TSVのドキュメントを鑑みると, もしText::CSVでTSVをパースしたいのであれば,, 次のように設定してあげると良さそうです:

my $tsv = Text::CSV->new({
    sep_char => "\t",
    quote_char => undef,
    escape_char => undef,
});

...多分, これが一番ベターだと思います.

とはいえ, Text::CSVはコアモジュールではないので, コアモジュール縛りで行くならsplit を駆使する手を採用するということもあるでしょう. TMTOWTDIということで, その時々で最適な選択肢を選んでTSVをパースしていけると良さそうです.