CSVファイルでコンマが不正なレコード区切り記号/区切り記号であるのはなぜですか?


32

私はこの記事を読んでいたのですが、この質問に対する適切な答えに興味があります。

頭に浮かぶのは、おそらく国によっては小数点記号がコンマであり、CSVでデータを共有するときに問題になる可能性があることですが、答えはよくわかりません。


6
ほぼすべての区切り文字がコンマよりも優れています。その理由は、コンマ区切りファイルが一部のデータ解析ツールに読み込まれると、コンマが句読点と混同され、フィールドまたは列の「レイアウト」が混乱する可能性があるためです。
マイクハンター

33
皮肉屋は、この記事がSASパフの一部であることを指摘すると、おそらくSASがCSVファイルをコンマで処理するのに問題があることを示唆するかもしれません:-)。
whuber

3
@whuber-(私の経験では)SASは、カンマがあるかどうかにかかわらずCSVファイルと格闘することがあり、SASが気に入らないすべての奇妙なことに大量のハンドコーディングを必要とします。
ジェレミーマイルズ

8
パイプ、巡礼者、いばら -パイプ、巡礼者、いばら - ますます不明瞭な区切り文字の検索には絶望があります。また、普遍的な標準では、一部のテキスト文字列を他の作業に使用する必要がないという前提に頼るのではなく、テキスト文字列を(RFC4180のように)表現できるようにする必要があります。
Scortchi -復活モニカ

2
(a).csvファイルを正常にインポートしたことがよくあります。(b)データ内にコンマが含まれている場合は、.csvを使用しないことをお勧めします。これらは互いに矛盾しません。(b)いくつかの四半期で説明が必要なのは残念です。
ニックコックス

回答:


33

CSV形式の仕様は、RFC 4180で定義されています。この仕様が公開された理由は

正式な仕様は存在しないため、CSVファイルのさまざまな解釈が可能です。

残念ながら、2005年(RFCの公開日)以降、何も変わっていません。まださまざまな実装があります。RFC 4180で定義されている一般的なアプローチは、引用符でコンマなどの文字を含むフィールドを囲むことですが、この推奨事項は常に別のソフトウェアで満たされているわけではありません。

問題は、ヨーロッパのさまざまなロケールではカンマ文字が小数点として機能するため、の0,005代わりに記述することです0.005。しかし、他のケースでは、スペースの代わりにコンマが使用されて、数字グループを通知します(例えば、こちらを4,000,000.00参照)。どちらの場合も、コンマを使用すると、csvファイルからデータを読み取る際にエラーが発生する可能性があります。これは、ソフトウェアが2つの数字か4つの異なる数字かを実際に知らないためです(こちらの例を参照)。0,005, 0,1

最後に重要なことですが、データファイルにテキストを保存する場合、テキストではセミコロンよりもコンマの方がはるかに一般的であるため、テキストが引用符で囲まれていない場合、そのようなデータもエラーで簡単に読み取ることができます。

上記の問題から保護するRFC 4180としての推奨事項に従ってCSVファイルが使用されている限り、コンマを良くしたり、悪いフィールドセパレータにすることはできません。ただし、フィールドを引用符で囲まない単純化されたCSV形式を使用するリスクがある場合、または推奨事項が一貫して使用できない場合は、他の区切り記号(セミコロンなど)がより安全な方法と思われます。


6
RFC 4180で定義されている実際のCSV標準を実装するソフトウェアは、特定の文字列をどのように解釈するかを正確に知っています。,まれなセパレータの代わりに使用すると、常にエスケープする必要があるため、データが肥大化するという議論は真実です。そして、明らかに、CSVがどのように機能するかを知っているが、実際にはそうではない、と考える人がすべています。
VOO

2
@Vooはい。ただし「csv」ファイルはこのような混otic とした方法で使用されるため、コンマを使用せずに、代わりにセミコロンなどの他のセパレータを使用する方が安全です。これはOPの質問に対する答えです。コンマと比較してセミコロン(または他の非コンマ)に「より良い」ものはありません。多くの場合、単に安全な選択です。
ティム

2
@Voo +1をコメントに追加します。ただし、CSVを使用しているユーザーは、肥大化したデータファイルを実際に気にしません。
whuber

17

技術的には、コンマはセパレータとして使用される他の文字と同じくらい良いです。形式の名前は、値がコンマ区切り(コンマ区切り値)であることを直接示します。

CSV形式の説明では、区切り文字としてコンマを使用しています。

コンマを含むフィールドは二重引用符で囲む必要があります。なるようにデータを読み込むため、問題が発生することはありませんから点6を参照してください。説明

  1. 改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります。

たとえば、デフォルトでは、関数read.csvおよびwrite.csvfrom Rはセパレータとしてカンマを使用しています。


4
これはvaluesコンマ区切りで参照されるため、これが最良の回答です。ヨーロッパformattingの数字をほのめかす他の人は、standard上記のポイント6を正しく引用しているため、csvの問題ではありません。「正しい使用」との相違は、どのデータ形式にも存在します。ポイントは-データを知っていることです。他の人は言及tabまたは;区切られていますが、ユーザーが入力したデータを処理している場合、おそらくこれらはコンマと同じ問題を抱えている可能性があります(おそらくフォームを介してデータベースによってキャプチャされます-私は人々が太った指でtab...それは吸う)
エイドリアントーリー

Timの回答は、@ djhurioが提供する情報を含めるように編集されました。
エイドリアントリー

11

数字の桁区切りに加えて、多くの国では住所の一部(顧客の住所など)も形成します。いくつかの国は短い明確な住所を持っていますが、他の国の多くは、同じ行に2つのコンマを含む、長く曲がった住所を持っています。適切なCSVファイルは、そのようなデータをすべて二重引用符で囲みます。しかし、過度に単純化された、不完全に書かれたパーサーは、そのような読み取りと区別を提供しません。(その後、詩からの引用など、データの一部として二重引用符を使用する問題があります)。


2
(+1)標準では、二重引用符を再度二重にすることを要求することで、データの一部として二重引用符の使用を規定しています。「Belloc」、「Tarantella」、「」「High Pyreneesでからかうノミ」」イギリスでは、家の名前が引用符で囲まれている住所フィールドを見つけることは珍しくありません。したがって、「チャッツワース」、メルトンロード、リーミントンです。(理由は明らかではありません:ファウラーは、「意味は次のように思われます:賢明な人々は「164メルトンロード」と呼ぶ家に住んでいますが、1人の愚か者は「チャッツワース」と呼ぶのが好きです」)
Scortchi-Reinstate Monica

1
@Scortchi 12歳で同じ詩を学んだようです(+/-エラー)。20世紀初頭の、下層中流階級の習慣に対する上層中流階級の不愉快な英語のスヌーバとして読んだものが、あなたの最後の例を曖昧にしていることを恐れています。
ニックコックス

@NickCox:約12の音。面白いのは、今年の詩を読んだかどうかを思い出せないことです。もちろん、それらの行を思い出すことはできません。ファウラーのポイントは、不要な引用符(参照の読者に与える影響についてでしたがunnecessaryquotes.comを)、私はあなたの例の彼の選択で俗物根性の影響を見るためにしている権利だと思います。とにかく、英語の住所を含むCSVファイルを送信した場合に注意する必要があるという比較的重要でない点は、私の発言にもかかわらず明らかです。
Scortchi -復活モニカ

1
インドでは、最初の家(アパートではない)を建設する人々が、多くの場合、俗語やサンスクリット語で革新的な花の名前を付け、「Guru Kripa」などの二重引用符を付けます。Genelia D'SouzaやDerek O'Brienなどの名前も一般的です。次に、「古いドア番号nnn /新しいドア番号mm / c」と言うアドレスは、予期しないコーナーにスラッシュと一重引用符が含まれているため、アドレスの保存がさらに複雑になります。
ワールマインド

@WhirlMind:それは興味深い-私は多くのことに気づいた-まあ、予想以上に-スコットランドのゲール語とウェールズ語の家の名前は、おそらくあなたの家に名前を付けるための俗語を選ぶことに最も近いものです。
Scortchi -復活モニカ

9

@Timの答えは正しいですが、私は「csv」全体に共通の標準がないことを追加したいと思います-特にエスケープルールはまったく定義されておらず、あるプログラムで読み取り可能な「フォーマット」につながりますが、別のプログラムでは読み込めません。これは、太陽の下ですべての「プログラマー」が「oooh csv-私は自分のパーサーを構築する!」そして、すべてのエッジケースを見逃しています。

さらに、csvには、メタデータや列のデータ型さえも保存する能力がまったくないため、データを理解するために読む必要のあるいくつかのドキュメントにつながります。


5
はい、標準のtools.ietf.org/html/rfc4180があり、他の多くの形式はメタデータを保存しません。メタデータを保存するように設計されていません-.txtファイルはテキストドキュメントに関するメタデータも保存しません...
ティム

4
ティム、その標準は、それ以外の標準,,,作り、少なからず無視されます
クリスチャン・ザウアー

8
標準の素晴らしいところは、選択できるものが非常に多いことです。(さまざまな変異と帰属。)
ニックコックス

4

コンマ区切り文字を捨ててタブ文字を使用できる場合は、はるかに成功します。.CSVという名前のファイルを残すことができ、ほとんどのプログラムへのインポートは通常問題になりません。ファイルをインポートするときは、カンマではなくタブ区切りで指定してください。データにカンマが含まれている場合、コンマ区切りを指定すると問題が発生します。


5
データにタブがある場合は、逆が適用されます。少なくとも、私の経験では、そうではありません。
ニックコックス

@Nick and Gorilla:自作の|csvのようなレコードのテキストファイル(書籍のタイトルやその他のドキュメントメタデータを含む)の区切り文字として良い結果が得られました。 |私が扱うデータには決して発生しないので、クォートをチェックせずに単純に分割/結合するperlスクリプトを書くことができます。これは、MS Accessデータベースから保存されたメタデータを処理するだけの1回限りのプロジェクト用でした。大規模なプロジェクトの場合、またはこのファイル形式でデータを長期間保持する場合は、より堅牢なものを選択してください!今月のバッチが何かを壊した場合、私はいつも何かを微調整することができました。
ピーターコーデス

@PeterCordesあなたを信じています。しかし、明らかに、特異なセパレータのコストは、それらを他の人に説明する必要があるかもしれず、それらがそのようなデータファイルを難なくインポートできることが重要です。珍しいファイル形式に直面して、任意のセパレーターで文字列を分割できるルーチン、関数、またはコマンドにアクセスする必要があります。
ニックコックス

@PeterCordes splitStataのコマンドを書いたとき、特にPerlの同等物を見て、それが何をし、何をしなかったかを確認しました。ソースコードではなく、提供される機能だけです。
ニックコックス

1
@NickCox:perlの機能の多くは非常にうまく設計されています、IMO。awk(多くの場合は良い)やespに見られるような多くの特別な制限なしに仕事を完了します。他のUnixツールは好きcutsortuniq
ピーターコーデス

4

ASCIIは、ascii(7)* nix manページの抜粋で以下に示すように、4つの「セパレータ」文字を提供します。

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

この回答は、意図した使用法の適切な概要を提供します。

もちろん、これらの制御コードには、より一般的な区切り文字の人間に優しい(読みやすさと入力)がありませんが、プログラム間での内部および/または一時的なデータ交換の許容可能な選択肢です。


2
面白い。私は...私が今までこれらが野生かかわらで使用さ見てきたとは思わない
マット・クラウス

4

問題はコンマではありません。問題は引用です。使用するレコードとフィールドの区切り文字に関係なく、コンテンツでそれらに対応する準備をする必要があります。したがって、引用メカニズムが必要です。そして、引用文字も表示する方法が必要です。

RFC 4180標準に従うことで、すべての人にとってすべてが簡単になります。

私は個人的に、おそらくこの間違いを犯したプログラムからの出力を修正するスクリプトを書かなければならなかったので、私はそれについて少し過激派です。「おそらく修正」とは、それがMYデータで機能したことを意味しますが、失敗する状況を見ることができます。(そのプログラムの防御では、標準の前に書かれていました。)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.