01/27 Perlでダブルクォーテーション内のカンマを取り除く方法

もう10年以上,JARL(日本アマチュア無線連盟)のコンテスト委員として,コンテスト結果のHTML化というのを担当している。審査が終わり,順位が確定したデータを事務局から受け取り,HTMLファイルにするのだ。最終的にはJARLのコンテストページに掲載される。


国際コンテストであるAll Asian DX Contestは事務局でHTML化しているので,自分は年に4回開催される国内コンテスト,ALL JA,6m AND Down,フィールドデー,全市全郡を担当している。Perlでスクリプトを組んでいるので,問題が無ければ30分で処理は終了・・・ のはずだがそう簡単にはいかない。
一番面倒なのが事務局から送られてくるCSVファイルはQSO数や得点など数値が3桁を越えるとダブルクォーテーションで囲んだ中に3桁区切りのカンマが入っているということ。コールサインやマルチなど各項目を変数に切り分けるのにカンマをセパレータとしている。だがダブルクォーテーション内のカンマもセパレータとして処理されてしまう。

これは
($call, $qso, $multi, $point) = split(/,/);
のようなスクリプトをつかっているのだが,それだと

JR1LQK,"1,023","207","211,761"

のようなデータを,JR1LQK,1023,207,211761として処理したいのに,JR1LQK,1,
203,207,211,761として取り込んでしまうのだ。

そのため,一度ExcelでCSVファイルを読み込み,数値の列を3桁で区切らない標準形式に変換して再保存,nkfでUTF-8に変換してからPerlのスクリプトで処理,という手順を踏んできた。大元のデータに間違いがあると,またShift-JISにしてExcelで読み込んで~となる。

正規表現を使えばダブルクォーテーション内が来て,数値が1個から3個並んで,カンマが来たらカンマを削除。という処理ができるはずだけど,なぜかうまくいかない。また,「マルチオペ入賞局オペレーターリスト」というのもある。これは参加者がオペレータ名を列挙して送ってくるので,半角カンマ,全角カンマ,全角点,スペースなどバラバラ。こちらも同じような前処理が必要だ。

Text::ParseWordsを使う

ネットで調べたところText::ParseWordsというライブラリを使うと,ダブルクォーテーション内のカンマを削除して処理できるという。ところが,このライブラリの使い方がよく分からないのだ。Perlの標準ライブラリなので,インストールの必要はないのだが,コードの実例ばかりで,英語以外にマニュアルが無い。

結局,splitでやっている処理をText::ParseWordsのparse_lineに置き換えればいいようだ。splitで変数に分割していた行をコメントアウトし,parse_lineで配列に収納,それを各変数にコピーする。


#($call, $qso, $multi, $point) = split(/,/);
my @line = &parse_line(",", undef, $_);
$call = @line[0];
$qso = @line[1];
$multi = @line[2];
$point = @line[3];

&parse_line(“,”, undef, $_)の「undef」を1にすると,ダブルクォーテーションは残ったままとなる。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください