アプリ版:「スタンプのみでお礼する」機能のリリースについて

実際にはCGIやPerlではなくHTMLの技術だと思いますがPerlがらみのことなのでこちらで質問させて頂きます。

PerlでCSVファイルを扱っているのですが、データの中にカンマ(,)が入るとそこで分割されて取り扱われるので、何か他のものに置き換えたいと思っています。

ですが勝手に自分で決めたものだと、表示する際に置き換えたデータを元に戻さないといけないし、万一自分が決めた形と同じ形のデータが存在すると表示するときに置き換えたデータをカンマに戻すとそのデータまで置き換わってしまうので、きちんとしたコードがないものかと思っているのですが、カンマのタグというものはないのでしょうか。
つまりは、半角スペースならと置き換えられると思いますが、このようなコードで書き換えることはできないのでしょうか。

例)
「123,123」というデータを登録するのに分割されるのを防ぐために「,」を「、」に置き換えると、表示する際に再度置換する必要がある上、同一データ内に「私は、○○です。」があるとその「、」まで「,」に変換されてしまうのでそれを防ぎたいし、できれば表示する際置換しなくていいものがあれば。

PS 専門用語が分らないのでうまく説明できなくてすみません。

A 回答 (5件)

perl で CSV を扱う一般論はさておき、CSVの内容をHTMLに埋め込むのが目的の場合には良い方法があります。



データ中の「,」 を , の5文字に変換してください。 HTML中の , という表示文字は、ブラウザが「,」を表示してくれます。

# No.1 さんはこの事をおっしゃってるんでしょう。


余談ですが、CSVをあなたの作ったプログラムのみでアクセスするならそれだけで良いです。 しかし、Excelで書き出した CSV を読むとか作ったCSVをExcelで読ませるとかが必要なら、他にも注意事項が沢山ありますよ。
    • good
    • 0
この回答へのお礼

ズバリそのものの回答ありがとうございます。
さっそくやってみます。

ところで、余談ですが、注意事項ぜひお聞かせください!

お礼日時:2009/05/06 22:03

> 注意事項ぜひお聞かせください!



CSV文法の基本規則は特にむづかしくありません。
http://www.kasai.fm/wiki/rfc4180jp

セルデータ中に 「,(カンマ)」、「"」、改行のいずれかを含む時は、セルデータ全体を「"」で囲む。 セルデータ中の「"」は「""(2個連続の")」に変換する。

それだけ守れば最低限の役には立ちます。

しかし、MS-Excel と CSV データを交換するにはもうちょっと工夫が必要です。 私も一部しか知りませんが、例えば

1 文字コードは Windows-31J (CodePage932 の事)

2 書き込み処理では改行コードは全て CRLF。 読込処理では、LF と CRLF の混在に耐えられる様に。 (あるバージョンの MS-Excel は、行区切りに CRLF を、セル内改行に LF を使います)

3 MS-Excel の「自動形式認識」は多くの場合有害。 例えば「1/2」というセルを持つCSVをMS-Excelで入力すると「1月2日」に化けたりします。 これを避ける為に強制的に文字列解釈させる方法はMS-Excelのバージョンで違っていて、Excel2003 の場合には「"=""1/2"""」 と書きます。

4 MS-Excel のCSV入力は、規則違反でもそこそこ面倒を見てくれます。 しかしそれでOKと思わずに規則は守りましょう。

以上、言葉で説明するのはまだ良いんですが、完全対応の入力処理を書くのは少々ムズいです。
    • good
    • 0
この回答へのお礼

追加のご教授ありがとうございました。
少しずつ勉強します。

お礼日時:2009/05/07 16:36

CSVファイルの場合は、一般的にデータの中にカンマが入っている場合はそのデータを”(ダブルコーテーション)で括ります。

エクセルでセルの中に 2,3 と入れてCSVファイルで出力してみてください。
    • good
    • 0
この回答へのお礼

ありがとうございます。
"でくくって、表示させる際は"を除外するという方法でしょうか。

お礼日時:2009/05/06 18:42

デリミタをカンマ以外に変更する方法もありますし、カンマを他の文字列に変更してしまう方法もあります。



a$ =~ s/\,/<------>/;
これでカンマが<------>に変換されますよね。
カンマに戻したいときには又逆に変換すればいいと思います。
<------>が使われる可能性があるのなら<<<---1234---5678---<<<000>>>とかでも良いと思います。
    • good
    • 0
この回答へのお礼

ありがとうございます。
一般的な文字列への変換は使われる可能性があるので避けたいです。

お礼日時:2009/05/06 18:39

ヒント:1


 ",".charCodeAt(0)

ヒント:2
 実態参照は数値してい可能

この回答への補足

すみません。
わかりません。

補足日時:2009/05/06 18:37
    • good
    • 0

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