電子書籍の厳選無料作品が豊富!

ソート機能がうまく動作しなくなりました。

CSVが以下のようなものとなったときにソートがうまく動作しなくなってしまいました。

CSVデータの区切りが「","」と「,」の混在で区切られてます。

(ここから) データa
"山田","埼玉県","男性"
"田中","埼玉県","男性"
"井上","栃木県","女性"
"志村","千葉県","男性"
(ここまで)

だったり

(ここから) データb
1,山田,埼玉県,男性,50,"予算2,000円",0
2,田中,埼玉県,男性,36,予算なし,0
3,井上,栃木県,女性,30,予算100円,0
4,志村,千葉県,男性,27,"予算300,000円",0
(ここまで)

このようなテータの時もあります。

以前のアドバイスをもとに以下のように作成いたしました。

(ここから)
while (my $line = <$ifh>) {
if ($socnt == 0 ){$socnt++;next;}
my $key = (split /\",\"/, $line)[$ccsv];
push @{$sorted{$key}}, $line;
if (@{$sorted{$key}} == 1000) {
open OUT, ">>./$key.tmp" or die "Can't open: $!";
print OUT @{$sorted{$key}};
close OUT;
@{$sorted{$key}} = ();
}
}
(ここまで)

この場合だと
my $key = (split /\",\"/, $line)[$ccsv];
データaはうまくいくのですが、データbがうまくソートが動作いたしません。
my $key = (split /,/, $line)[$ccsv];
ではデータbはうまくいくのですが、データaうまくソートが動作いたしません。

条件式で混在認識方法があるかと思っている(ないかもしれませんが、わたしには分かりません)ので質問いたしました。



ご教授いただけますと幸いです。
よろしくお願いします。

A 回答 (4件)

ダブルクォート文字列の中にクォートされたダブルクォートがなければ、次の文で両方に対応できると思います。



my $key = ($line =~ /("[^"]+"|[^,]+)/g)[$ccsv];
$key =~ s/"//g; # 必要かも
    • good
    • 0
この回答へのお礼

ありがとうございます。
分かりやすい説明ありがとうございました。
上記のソースを使用して若干訂正しましたらうまく動作いたしました。
とってもうれしい感謝です。

お礼日時:2012/08/04 20:29

正規表現のバイブル(と勝手に思ってる)


オライリの「詳説正規表現」に
引用符付きCSV形式について
相当なページ数を割いてるんだけど
そういう資料みてる?
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
正規表現についてまだまだ勉強不足です。
資料は見ていませんでした。
すみません。

お礼日時:2012/08/04 20:29

や, だから, 「『ダブルクォートの中にない ,』で区切ればいいんじゃね」といっとるわけだが....



普通に考えれば「CSV をなんかするモジュール」がありそう.
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
すみません。perlを使っているのは年月が長いのですが、見よう見まねでやっているので、皆さんの話についていけないときがあります。

お礼日時:2012/08/04 20:28

「ダブルクォートの中にない ,」で区切ればいい... のか?

この回答への補足

ありがとうございます。
説明不足でした。ダブルクォートでくくられているものはデータな中にカンマ「,」が入っています。
なので今のプログラムですと、ソートが正常に行われなくなってます。
これで説明が出来ていると良いのですが・・・
すみません。宜しくお願いします。

補足日時:2012/08/03 11:31
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

お礼日時:2012/08/04 20:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!