- PR -

改行コードを含んだCSVファイルの読み込みについて

投稿者投稿内容
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-07-15 11:54
何度もすいません、最初の投稿も田中さんのも、後で処理をちゃんとやられているのかもしれませんが、CSV って次のパターンもあるんですよね。

"a,b",c

こういうのがあるんで、いきなりカンマとかで split するとはまりますよね。
ぽぴ王子
ぬし
会議室デビュー日: 2006/03/24
投稿数: 475
お住まい・勤務地: お住まい:城・勤務地:城
投稿日時: 2006-07-15 12:48
こんにちは。

引用:

R・田中一郎さんの書き込み (2006-07-15 09:16) より:

>改行コードを含んだCSVファイル

これは CSVファイルと言わない希ガス・・・
TABで区切ったCSVファイルとか、固定バイト長で区切ったCSVファイルみたいなw


Comma Separated Value なので、TABや固定長区切りは
CSV じゃなく TSV とか他の呼び名があったりするわけですけど
ね。

システムでインポートやエクスポートする必要がある場合は、仕様
書にその辺含めてきちんと明記しておきますね。そうしないとオレ
オレ仕様(byかつのりさん)の ほにゃらら Separated Value が
たくさんやってきて「なんで読めないんだ!」って言われそうです。
(仕様書に書いてあるでしょと言うと「読めるようにしてくれ」と追加
仕様が出てきそうですが)

ずーっと昔、管理工学研究所に K3 フォーマットの資料を請求した
ことがあって、それの回答 FAX をテキストに起こしたものがなぜ
か手元に。
それによると、項目値の中にダブルクォーテーションを使う場合は
二文字連続で書くそうですよ。
_________________
ぽぴ王子@わんくま同盟
ぽぴ王子の人生プログラミング中 / ぽぴンち。
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2006-07-16 02:31
引用:

それは CSV として NG なので、出力側を何とかすべきだと思います。



フィールドに改行を含むことはRFC(http://www.rfc-editor.org/rfc/rfc4180.txt)
でも許されてますけど、CSVとしてNGというのは何を根拠におっしゃられてますか?

{quote]
6. Fields containing line breaks (CRLF), double quotes, and commas
should be enclosed in double-quotes. For example:
[/quote]

R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-16 03:19
引用:

わちゃさんの書き込み (2006-07-15 11:54) より:

"a,b",c

こういうのがあるんで、いきなりカンマとかで split するとはまりますよね。



や、確かに、先ほどテストしてみたらはまりましたw
設計ミスですね・・・orz
そもそも、カンマを含んでいる文字列を、ひとつの文字列とするために " で括る訳だから最初に分離しちゃ何にもなりませんね。

引用:

ぽぴ王子さんの書き込み (2006-07-15 12:48) より:

引用:

R・田中一郎さんの書き込み (2006-07-15 09:16) より:

>改行コードを含んだCSVファイル

これは CSVファイルと言わない希ガス・・・
TABで区切ったCSVファイルとか、固定バイト長で区切ったCSVファイルみたいなw


Comma Separated Value なので、TABや固定長区切りは
CSV じゃなく TSV とか他の呼び名があったりするわけですけど
ね。


さすがに固定バイト長で区切ったファイルも CSV と呼ぶ人は少ない(けどゼロではないw)ですが、TSV を CSV と呼ぶ人は結構おりますです。

#そのたびに、おかゆライス噴出してますw
R・田中一郎
ぬし
会議室デビュー日: 2005/11/03
投稿数: 979
投稿日時: 2006-07-16 03:32
引用:

paniponi-xさんの書き込み (2006-07-16 02:31) より:

引用:

それは CSV として NG なので、出力側を何とかすべきだと思います。



フィールドに改行を含むことはRFC(http://www.rfc-editor.org/rfc/rfc4180.txt)
でも許されてますけど、CSVとしてNGというのは何を根拠におっしゃられてますか?


きくちゃんさんの仰るNGというのは改行がレコード分離符との区別がつかない状態を指しているのだということだと思いますが。

"data改行data","改行改行"改行  →OK
data改行data, 改行改行改行   →NG

ってことですよね?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-07-16 08:59
引用:

paniponi-xさんの書き込み (2006-07-16 02:31) より:
フィールドに改行を含むことはRFC(http://www.rfc-editor.org/rfc/rfc4180.txt)
でも許されてますけど、CSVとしてNGというのは何を根拠におっしゃられてますか?


RFC 4180 なるものがあったのか(そのようなものがあるとは知らなかった〜)、
と思ったのですが、上記のページを見てみると、
引用:

Network Working Group Y. Shafranovich
Request for Comments: 4180 SolidMatrix Technologies, Inc.
Category: Informational October 2005


と書かれていますよね。
これは、10か月前にできた仕様、ということですよね。
(プロジェクトの完了間際に追加で仕様が知らされるみたい。)

個人的な感想としては、コンマで終わってはいけない、という制約がいやらしく思います。
引用:

4. Within the header and each record, there may be one or more
fields, separated by commas. Each line should contain the same
number of fields throughout the file. Spaces are considered part
of a field and should not be ignored. The last field in the
record must not be followed by a comma. For example:

aaa,bbb,ccc


これだと、最後のフィールドが長さ0の文字列だった場合に表現できないことになります。
(なお、長さ0の文字列とみなすか NULL とみなすかはアプリケーションの勝手だとは思いますが。)

あと、個人的な思いとしては CSV は CRLF and comma separated values format であってほしかった。すなわち、まず大前提として改行で行を分離して、その後コンマで列を分離する(だから行の中に改行がない)、という仕様であってほしかったです。

ちなみに、日本語訳もありました。
http://www.kasai.fm/wiki/rfc4180jp

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
わちゃ
大ベテラン
会議室デビュー日: 2005/12/05
投稿数: 162
お住まい・勤務地: 東京
投稿日時: 2006-07-16 11:35
CSV って、RFC にあったんですね。

でも、次の文が確かに、微妙な感じですね。

The last field in the record must not be followed by a comma.

最後のフィールドがヌルだったら、"" にしないといけないのかなと思いつつ、
単に最後のカラムの後にカンマを入れちゃいけないってことでは?とも思います。

すいません、英語苦手なもんで。
paniponi-x
常連さん
会議室デビュー日: 2006/01/14
投稿数: 27
投稿日時: 2006-07-16 15:29
引用:

と書かれていますよね。
これは、10か月前にできた仕様、ということですよね。



はい。ですが、いきなり湧いて出たものではなくリンクに示されているように
これまでの各種の仕様を踏まえて作成されたものであろうとは考えられます。
実際Excelでも(RFCのものとは微妙に違いますが)改行を含むことがあるのは
すでに提示されているとおりです。

ですから、「フィールドに改行を含んだらNG」という説の根拠を伺いたかったのです。

引用:

あと、個人的な思いとしては CSV は CRLF and comma separated values format であってほしかった。すなわち、まず大前提として改行で行を分離して、その後コンマで列を分離する(だから行の中に改行がない)、という仕様であってほしかったです。



まあある意味現状追認のRFCですから、それだけ改行を含むCSVファイルが
使われているということではないでしょうか?

あと、カンマで終わってはいけないという文ですが、セクション2の末尾にある
ABNF表記のものを(機械的に)解釈すると、カンマで終わっても(直後に
空のフィールドあり)、vaildととれなくもないような気がします。

スキルアップ/キャリアアップ(JOB@IT)