blog20100901

2013/08/20 - プログラミング言語 Perl にまつわる etc. - Perl monger
参考 : perldoc, perldoc.jp, search.cpan.org, perldoc.perl.org ...
「 初めての Perl 第 6 版 」(オライリー・ジャパン発行 ISBN978-4-87311-567-2) 」
「 続・初めての Perl 改訂版 」(オライリー・ジャパン発行 ISBN4-87311-305-9) 」
「 Effective Perl 第 2 版 」(翔泳社発行 ISBN978-4-7981-3981-4) 」 ... etc,.

Perl Perl_1

Perl 「 モジュール 」 ( 割り込み ) Text::CSV_XS インストール (0xb7)

Perl 「 モジュール 」 ( 割り込み ) Text::CSV_XS インストール (0xb7)

目次 - Perl Index


Theme



Perl について、復習を兼ねて断片的な情報を掲載して行く連載その 0xb7 回。

Perl モジュール Text::CSV_XS のインストール方法を割り込み ( interrupt ) で確認する。



カンマ区切り ( CSV ) データを処理する



ダブルクォート入りのカンマ区切り ( CSV ) データを分割することになりました。これを機会に CSV データの操作が得意なモジュール Text::CSV_XS の利用方法を確認します。

これまでも、CSV のデータの処理は行っていました。

しかしながら、それらは素朴な CSV データだったため、次のコードで特に不便なく分割出来ていたのです。


my @arry = split /,/; # カンマ区切りで行を分割


しかし今回対象としたデータは、次の様に「 " " 」で括られたダブルクォーテッドのフィールドが存在しています。

ダブルクォーテッドされたフィールド内には、当然の様にカンマ区切りされた文字列が存在しています。


foo,bar,"baz0,baz1",qux,quux
foo,bar,"baz0,baz1,baz2,baz3",qux,quux
foo,bar,"baz0,baz1",qux,quux
foo,bar,"baz0,baz1,baz2,baz3,baz4,baz5",qux,quux


ダブルクォーテッドされたフィールド内の分割数が固定長であれば、上記の素朴な split で事足りますが、今回のデータは、可変長であることを避けられないため、何かしら対策をする必要があります。

そもそも、固定長であれば、ダブルクォーテッドする必要性はない ( はずな ) ので、ダブルクォーテッドされている CSV データは必然的に対策をしなければいけません。

ちなみに、本来はこれを次の様に分割したいと考えます。


foo bar "baz0,baz1" qux quux
foo bar "baz,baz1,baz2,baz3" qux quux
foo bar "baz0,baz1" qux quux
foo bar "baz0,baz1,baz2,baz3,baz4,baz5" qux quux



これであれば、3 番目のフィールドは複数の値を持った 1 つのフィールドとして扱える上、4 番目のフィールドは、正しく 4 番目の値を表すことになります。

しかしながら、素朴な split では、当然次の様に分割されます。


foo bar "baz0 baz1" qux quux
foo bar "baz0 baz1 baz2 baz3" qux quux
foo bar "baz0 baz1" qux quux
foo bar "baz0 baz1 baz2 baz3 baz4 baz5" qux quux


これだと、3 番目のフィールドの値は不完全な値になりますし、加えて 4 番目以降のフィールドの値がおかしな値 ( 不特定の値 ) になってしまいます。

この問題を解決 ( CSV データを正しく分割 ) するためには、モジュール Text::CSV_XS を利用します ( モジュールが使えるって素晴らしい )。


モジュール Text::CSV_XS の前に cpanm をインストール



モジュール Text::CSV_XS は、現在 Perl 標準では配布されていない ( 標準添付モジュールではない ) 様なので、ユーザが独自にインストールする必要があります。

僕が利用している ( Drive Network のレンタル) 環境では、モジュール local::lib を利用して、レンタルサーバの一般ユーザでも、問題なく CPAN.pm を利用出来る様に設定しています ( see, (0x8e), (0x8f), (0x90), (0x91), (0x92), (0x93) )。

このままコマンド cpan を利用して、モジュールをインストールしても良いのですが、今回の環境には cpanm をインストールしていないことに気がついたので、ついでに cpanm もインストールしておこうと思います。

cpanm は次の様にしてインストールしました。cpanm は「 App::cpanminus 」として指定します。


$ cpan
cpan[1]> install App::cpanminus


インストールは問題なく完了です。

次にコマンド cpanm を利用してモジュール Text::CSV_XS をインストールしましょう。


$ cpanm Text::CSV_XS


ここで僕はひとつ躓きました。

ローカルの ~/perl5/bin/ に $PATH は通っているはずなのに、コマンド cpanm が使えません。

「 コマンドが見つかりません 」って、そんな訳はありません。きっと何かを忘れて... 「 rehash 」!!

(0x91) で確認したコマンド rehash を実行して再度コマンド cpanm を実行すると、問題なく動作しました。ふふふ。


モジュール Text::CSV_XS をインストール



ここまでくれば、モジュール Text::CSV_XS のインストールはイージーです。


$ cpanm Text::CSV_XS


エラーもなく、インストールは完了しました。

cpanm 速いです。

0xb7 -> 0xb8 へ



次回は、モジュール Text::CSV_XS を利用した基本的な CSV データの処理、のためのメソッド parse() を確認します。

参考情報は以下の書籍を中心に Wikipedia および各 Web サイト。それと詳しい先輩。

参考 :「Randal L. Schwartz, brian d foy, Tom Phoenix 共著 近藤 嘉雪 訳「初めての Perl 第 6 版」(オライリー・ジャパン発行 ISBN978-4-87311-567-2)」


次回 (0xb8) へ続く。

目次 - Perl Index











同じカテゴリー(Perl)の記事
 Perl mp2 翻訳 Web コンテンツ圧縮の FAQ (d228) (2023-10-11 23:49)
 Perl mp2 翻訳 既知のブラウザのバグの回避策をいくつか (d227) (2023-05-26 15:41)
 Perl mp2 翻訳 Perl と Apache でのキュートなトリック (d226) (2023-05-19 17:05)
 Perl mp2 翻訳 テンプレートシステムの選択 (d225) (2022-08-15 22:23)
 Perl mp2 翻訳 大規模 E コマースサイトの構築 (d224) (2022-06-15 20:43)
 Perl mp2 翻訳 チュートリアル (d223) (2022-06-15 20:42)
上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

Llama
リャマ
TI-DA
てぃーだブログ
プロフィール
セラ (perlackline)
セラ (perlackline)
QRコード
QRCODE
オーナーへメッセージ

PAGE TOP ▲