[PHP-dev 975]Re: fgetcsv仕様変更について(wasfgetcsv

Tomoyuki Asakawa tom @ asakawa.ne.jp
2004年 1月 12日 (月) 07:27:08 JST


あさかわ

>>> fgetcsv() を使っている方は 4.3.4 もですが 4.3.5 への移行は
>>> 現時点では避けた方がいいと思います。仕様が大きく変えられています。
>>
>> えええ、まだかわるのですか?
>
> 先日の php-dev 952 から始まる仲村さんの報告を見てください。
> まだこの問題が未解決なのです。

タイトルで読み飛ばしてました。
イタイですね。

> csv というフォーマットを考えるときに、何を手本にするかということが問題な
> わけですね。csv というフォーマットは一般に認知されているにもかかわらず
> 標準をもたないという点で非常におもしろいと思うのですが、
> あさかわさんのおっしゃるようにかつて(?) の BASIC の input # なフォーマットを
> 手本とするのが妥当かもしれませんし、また別の手本もあるでしょう。それは

手本ではなく、原典なんですよ。ビジカルクの。
これ以前には、存在しないのですから。

> 実装者のバックグラウンドによると思います。*nix な世界だけで育ってきた
> 方々もいるわけですし。私は OPEN "CAS:" FOR INPUT AS #1 な人でしたが。

バックグランドの問題は、*nixな人が、表面的に、csvを実装してしまった事で
引き起こした結果です。

>
> \ でエスケープする仕様が全面的に間違っているというように私は思いません。
> しかし、個人的見解からするとあまり一般的ではないようには思います。

一般的かどうかではなく、原典からすると、間違った実装が
20年の間に、一部ではびこってしまったということです。


> 結論から言うと、さまざまなフォーマットに対応できるよう、オプションを
> 設けるべきなのですが、アドホックな拡張を繰り返してきた fgetcsv() には
> これ以上オプション引数を追加できないのではないかと思います。だから、
> 別の関数 (parse_csv でもいいですが) を追加して、そっちにまとめるのが
> 妥当かと思います。ここはあくまで私見ですが。

関数名を変えるかどうかは別にして。
いちおう原典を決めてそれに対するオプションにする必要があります。
そこで、変な実装で作成された、csv処理系と交換するためには。
以下のオプションで十分だと思います。

¥をエスケープする/しない(デフォルトはしない)
セパレータを任意の文字にする(デフォルトはカンマ)
セル内論理改行コードを指定する。(デフォルトなし)
文字列識別子を指定する(デフォルトはダブルクオート)
セル頭、セル末の空白を有効にするしない(デフォルトはしない)

#なので、splitのオプションでもいんですよね。

あと、オプションではないのだけど、実装上の注意で

文字列識別子とセパレータの、優先順位があります
先にセパレータ(,)で、分割してしまうと、""でくくられた、文字列中のセパレータ(,)と同じ
文字で、分割してしまうからです。","は、,です、つまり、"が一番エライのです。
また、文字列識別子として、"を指定した場合"は"でエスケープします。
なので、""""は、"一個です。

セル内論理改行コードを指定する場合、行末コードとセットになります。
Windowsのエクセルの場合は、
セル内論理改行コードが0a,行末は0d0aです。

MAC用エクセルでは、セル内論理改行コードの入力方法がわからない(ないかもしれない)ですが
行末は、0dです。














PHP-dev メーリングリストの案内