私はこの記事を読んでいたのですが、この質問に対する適切な答えに興味があります。
頭に浮かぶのは、おそらく国によっては小数点記号がコンマであり、CSVでデータを共有するときに問題になる可能性があることですが、答えはよくわかりません。
私はこの記事を読んでいたのですが、この質問に対する適切な答えに興味があります。
頭に浮かぶのは、おそらく国によっては小数点記号がコンマであり、CSVでデータを共有するときに問題になる可能性があることですが、答えはよくわかりません。
回答:
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形式を使用するリスクがある場合、または推奨事項が一貫して使用できない場合は、他の区切り記号(セミコロンなど)がより安全な方法と思われます。
,
まれなセパレータの代わりに使用すると、常にエスケープする必要があるため、データが肥大化するという議論は真実です。そして、明らかに、CSVがどのように機能するかを知っているが、実際にはそうではない、と考える人がすべています。
技術的には、コンマはセパレータとして使用される他の文字と同じくらい良いです。形式の名前は、値がコンマ区切り(コンマ区切り値)であることを直接示します。
CSV形式の説明では、区切り文字としてコンマを使用しています。
コンマを含むフィールドは二重引用符で囲む必要があります。なるようにデータを読み込むため、問題が発生することはありませんから点6を参照してください。説明:
- 改行(CRLF)、二重引用符、およびコンマを含むフィールドは、二重引用符で囲む必要があります。
たとえば、デフォルトでは、関数read.csv
およびwrite.csv
from Rはセパレータとしてカンマを使用しています。
values
コンマ区切りで参照されるため、これが最良の回答です。ヨーロッパformatting
の数字をほのめかす他の人は、standard
上記のポイント6を正しく引用しているため、csvの問題ではありません。「正しい使用」との相違は、どのデータ形式にも存在します。ポイントは-データを知っていることです。他の人は言及tab
または;
区切られていますが、ユーザーが入力したデータを処理している場合、おそらくこれらはコンマと同じ問題を抱えている可能性があります(おそらくフォームを介してデータベースによってキャプチャされます-私は人々が太った指でtab
...それは吸う)
数字の桁区切りに加えて、多くの国では住所の一部(顧客の住所など)も形成します。いくつかの国は短い明確な住所を持っていますが、他の国の多くは、同じ行に2つのコンマを含む、長く曲がった住所を持っています。適切なCSVファイルは、そのようなデータをすべて二重引用符で囲みます。しかし、過度に単純化された、不完全に書かれたパーサーは、そのような読み取りと区別を提供しません。(その後、詩からの引用など、データの一部として二重引用符を使用する問題があります)。
@Timの答えは正しいですが、私は「csv」全体に共通の標準がないことを追加したいと思います-特にエスケープルールはまったく定義されておらず、あるプログラムで読み取り可能な「フォーマット」につながりますが、別のプログラムでは読み込めません。これは、太陽の下ですべての「プログラマー」が「oooh csv-私は自分のパーサーを構築する!」そして、すべてのエッジケースを見逃しています。
さらに、csvには、メタデータや列のデータ型さえも保存する能力がまったくないため、データを理解するために読む必要のあるいくつかのドキュメントにつながります。
コンマ区切り文字を捨ててタブ文字を使用できる場合は、はるかに成功します。.CSVという名前のファイルを残すことができ、ほとんどのプログラムへのインポートは通常問題になりません。ファイルをインポートするときは、カンマではなくタブ区切りで指定してください。データにカンマが含まれている場合、コンマ区切りを指定すると問題が発生します。
|
csvのようなレコードのテキストファイル(書籍のタイトルやその他のドキュメントメタデータを含む)の区切り文字として良い結果が得られました。 |
私が扱うデータには決して発生しないので、クォートをチェックせずに単純に分割/結合するperlスクリプトを書くことができます。これは、MS Accessデータベースから保存されたメタデータを処理するだけの1回限りのプロジェクト用でした。大規模なプロジェクトの場合、またはこのファイル形式でデータを長期間保持する場合は、より堅牢なものを選択してください!今月のバッチが何かを壊した場合、私はいつも何かを微調整することができました。
split
Stataのコマンドを書いたとき、特にPerlの同等物を見て、それが何をし、何をしなかったかを確認しました。ソースコードではなく、提供される機能だけです。
cut
、sort
とuniq
。
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)
この回答は、意図した使用法の適切な概要を提供します。
もちろん、これらの制御コードには、より一般的な区切り文字の人間に優しい(読みやすさと入力)がありませんが、プログラム間での内部および/または一時的なデータ交換の許容可能な選択肢です。
問題はコンマではありません。問題は引用です。使用するレコードとフィールドの区切り文字に関係なく、コンテンツでそれらに対応する準備をする必要があります。したがって、引用メカニズムが必要です。そして、引用文字も表示する方法が必要です。
RFC 4180標準に従うことで、すべての人にとってすべてが簡単になります。
私は個人的に、おそらくこの間違いを犯したプログラムからの出力を修正するスクリプトを書かなければならなかったので、私はそれについて少し過激派です。「おそらく修正」とは、それがMYデータで機能したことを意味しますが、失敗する状況を見ることができます。(そのプログラムの防御では、標準の前に書かれていました。)