CSVファイルを読込書込時の注意点は?

[上に] [前に] [次に]
ケンヤム 2000/06/09(金) 18:26:01
調べてみてもわからなかったので、質問させていただきます。

csvファイルの読込の際の、各項目をばらし方ですが
私の方法は、
","の位置を探して、頭の文字からそのポインタまでの文字を取り、ポインタをずらしてまた次の
項目を取るというような方法しか出来ません。

一応それで頑張ってましたが、項目に金額等でよく使われる\50,000とか言う文字が入っていた場合
まずいような気がするのですが。

csvファイルに書く際に防ぐ方法(正しい書込み方)、また
もっとよいばらし方をお教え願えないでしょうか?

よろしくお願いします。

2000/06/09(金) 18:58:01
ダブルクォーテーションで囲む。

Fuji.♪ [E-Mail] [HomePage] 2000/06/09(金) 19:08:15
文字列は""で括って数値の場合は""で括らない、が昔は基本だったと思うのだけどなぁ・・・。 (^_^;
手抜きがしたいなら、カンマ区切りではなくタブ区切りとかにすると良いかも。文字列中にタブが使いたい場合は使えないけど。

ケンヤム 2000/06/09(金) 19:10:10
さっそくありがとうございます。

もう少しわかりやすくお願いします。

#書込み
$moji="金額";
$yen="50,000";
$filename="text.csv";
open(OUT,">>$filename");
print OUT,$moji;
print OUT,$yen;
close OUT;
じゃだめで、
$yen="\"50,000\"";
と書けばよいのですか?

Fuji.♪ [E-Mail] [HomePage] 2000/06/09(金) 21:50:20
この出力したデータは何で取り扱うのですか?
タブ区切りにしたほうが楽なような。

とりあえず、 print OUT, $moji; じゃなくて print OUT $moji; ですね。
\50,000という文字列を""で括るなら、 \"\\50,000\" じゃないのでしょうか。\マークが抜けてますよね。

そうじゃなく、このデータを扱うプログラム側で\を付けるから問題ない、というのであれば最初から 50000 という数値を渡して処理させたほうが楽です。

やんぼ 2000/06/09(金) 23:09:42
保存時に
  $value =~ s/\,/\0/g;
と置き換えて、開くときに
  $value =~ s/\0/\,/g;
などと置き換えるのは。

とほほ 2000/06/10(土) 23:31:12
自分のプログラムだけで読み書きするCSVでしたら、
私も「タブ区切りにする」に1票。

また、もし、Excelで読み書きするCSVファイルを想定でしたら、
 ・項目にカンマを含む場合は "..." で囲む
 ・その中に " がある時は "" とする
(・・・だったかな、うろ覚えなので正確じゃないかもしれません。)
などの規則があるので、それに従った処理を行う必要があるようです。

たーむ 2000/06/11(日) 04:47:05
http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values

にCSVからの値の取り出し、CSVへの変換が書いてあります。
ホントにここは勉強になります。

ぼくはタブ区切りにしてますが。

ケンヤム 2000/06/12(月) 10:25:20
たくさんのレス有り難うございます。
土日チェックする事が出来なくて、申し訳ないです。

>http://www.din.or.jp/~ohzaki/perl.htm#CSV2Values
>ぼくはタブ区切りにしてますが。

まだ見ている最中ですが、非常に参考になり、有り難うございます。
csv形式では、ちょっと気を付けないとまずいですね!

ところで、タブ区切りの書き方、読み方が分からないのですが..。
初歩的な質問で申し訳ないです、よろしくお願いします。

Fuji.♪ [E-Mail] [HomePage] 2000/06/12(月) 10:56:10
単に"a\tb"と書けばaとbの間にタブが入ります。
読み込むときは単に文字列なので $data = <CSV> で読み込めます。
Perlで切り出す場合はsplit(/\t/)だけ。Cで切り出すならstrtok()がお手軽。

perlopやperlreにも(この場合はperlreはあんまり関係ない? (^^;)書かれています。ドキュメントを参照しましょう。

ケンヤム 2000/06/12(月) 11:25:27
すばやいレス有り難うございます。さっそくやってみます。
一応解決としておきます。
P.S.ちょっと私の持っている本(実践入門Perlアークシンクタンク著)は詳しくその辺の所が載ってないので、
新しい本を探してみます。初歩の初歩の質問に、親切なご回答有り難うございました。

ケンヤム 2000/06/12(月) 11:26:12
[[解決]]
解決マークを忘れてました。

[上に] [前に] [次に]