[JavaScript][Perl] 続・正規表現を使ったCSVパーサ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[JavaScript][Perl] 続・正規表現を使ったCSVパーサ

正規表現を使ったCSVパーサの続き。

トークン化したCSVを解釈するコードをJavaScriptとPerlで書いた。二つのロジックはほぼ同じ。

それぞれ、第一引数には解釈するCSVテキストを渡し、第二引数ではfield間の区切り文字を指定する。デフォルトはコンマ(,)。戻り値は、CSVを解釈した2次元配列(Perlの場合はリファレンス)。

JavaScript

function parseCSV(text, delim) {
    if (!delim) delim = ',';
    var tokenizer = new RegExp(delim + '|\r?\n|[^' + delim + '"\r\n][^' + delim + '\r\n]*|"(?:[^"]|"")*"', 'g');

    var record = 0, field = 0, data = [['']], qq = /""/g;
    text.replace(/\r?\n$/, '').replace(tokenizer, function(token) {
        switch (token) {
            case delim: 
                data[record][++field] = '';
                break;
            case '\n': case '\r\n':
                data[++record] = [''];
                field = 0;
                break;
            default:
                data[record][field] = (token.charAt(0) != '"') ? token : token.slice(1, -1).replace(qq, '"');
        }
    });

    return data;
}

Firebugで実行した結果が↓

>>> parseCSV('aaa,"bbb"\n"c""c","d,d"\n"e\ne",,""')
[["aaa", "bbb"], ["c"c", "d,d"], ["e\ne", "", ""]]

Perl

/** parseCSV.pl */
sub parseCSV($;$) {
    my($text, $delim) = (shift, shift || ',');

    $text =~ s/\n$//;
    my($record, $field, $data) = (0, 0, [['']]);
    foreach ($text =~ /$delim|\n|[^$delim"\n][^$delim\n]*|"(?:[^"]|"")*"/g) {
        $data->[$record][++$field] = '', next if ($_ eq $delim);
        $data->[++$record] = [''], $field = 0, next if ($_ eq "\n");

        s/^"|"$//g, s/""/"/g if (/^"/);
        $data->[$record][$field] = $_;
    }

    return $data;
}

実行結果↓

>>> parseCSV qq/aaa,"bbb"\n"c""c","d,d"\n"e\ne",,""/
[["aaa", "bbb"], ["c\"c", "d,d"], ["e\ne", "", ""]]

一応は、

望み通りの動きをしてくれている様子。Excelで出力した素朴なCSVファイルを処理する分にはこの程度のスクリプトで充分そうだ。

スポンサーサイト

関連記事

トラックバック URL

http://liosk.blog103.fc2.com/tb.php/75-1c77255c

トラックバック

創るmetaboy 紹介したリンク集:更新!現在 167件 、今回はAjax化・・・ 【創ったmetaboy】
また1ヶ月が終わるので、整理・・整理・・ 紹介してきたサイトやツールのURLの整理を行っておこう。 > (上部メニュー [ 紹介したリンク集 ]...
  • 2008-10-28
  • 発信元: 創るmetaboy

コメント

とっても参考になりました。
利用させていただきます!
  • 2010-01-10
  • by KOBA789
  • id:-
ちょっとしたツール作成に使わせていただきました.
http://sites.google.com/site/nssvdabb/csv2tex
  • 2010-01-14
  • by abe
  • id:MzF64ICo
  • 編集

コメントの投稿

お名前
コメント
編集キー
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。