Perlでセル内改行つきのCSVファイルを処理する方法


PerlExcelとかで作ったセル内改行(複数行にわたるレコード)つきCSVファイルを処理する方法。

意外と知らない人がいたので。

Text::CSV_XS を使って。


#!/usr/local/bin/perl
use strict;
use warnings;

use IO::File;
use Text::CSV_XS;

my $fh = IO::File->new('test.csv') or die 'cannot open file';
my $csv = Text::CSV_XS->new({binary => 1});
until ($fh->eof) {
my $columns = $csv->getline($fh);
# $columns->[0]
}
$fh->close;

syntax highlight by VimColor


binary オプションが必要。

getline を呼ぶと、カラムが終了していない行の場合は終了行になるまで読み込んでくれる。

出力は


$csv->print($fh, $columns);

とすればOK。


関係ないけど、until とか unless が文脈にばっちりはまるときってかっこいいなぁ。

Perl使いにしかわからないことだけど。