CSV (MS-Dos)、CSV (Macintosh)、CSV (カンマ区切り) の違いは何ですか?

CSV (MS-Dos)、CSV (Macintosh)、CSV (カンマ区切り) の違いは何ですか?

Excel 2010 の CSV (MS-Dos)、CSV (Macintosh)、CSV (カンマ区切り) ファイル タイプの違いは何ですか? これらはすべて保存ファイル タイプとしてリストされていますが、最終的にはカンマ区切り値ファイルです。

答え1

[それらの]違いは、テキスト フィールドに特定の特殊文字 (たとえば、アクセント付き (外国語) 文字) があるかどうかです。Windows CSV としてエクスポートすると、それらのフィールドは Windows-1252 コード ページを使用してエンコードされます。DOS エンコードは通常、コード ページ 437 を使用します。これは、Windows 以前の古い PC で使用されていた文字をマップします。一方としてエクスポートし、もう一方を想定するツールでインポートすると、ほとんどのものは問題なく表示されますが、たとえば、名前にウムラウト (またはその他の外国語文字) が含まれている人を知っている場合は、予期しない結果になります。

ソース

答え2

Excel の CSV (MS-Dos)、CSV (Macintosh)、CSV (カンマ区切り) ファイル タイプの違いは何ですか?

Excel 16.8 2023 MS365 の使用:

(macOS 12.6 ファイル 5.41 Darwin他file)

file *.csv
MSDOS.csv: CSV text
MAC.csv: ASCII text, with CR line terminators
CSV.csv: CSV text

注:file推測値を提供し、csv 形式の長さに応じてさまざまな回答を返すことができます。

キャリッジ リターン (CR) バイトとライン フィード (LR) バイトの存在はフォーマットの大きな違いであり、内部で調べるとさらに明確になります。

0x0d CR 0x0a LF

 for file in *.csv; do echo -n $file" "; xxd $file | tail -2; done
CSV.csv 000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,
MAC.csv 00001260: 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c  .,,,.,,,.,,,.,,,
00001270: 0d2c 2c2c                                .,,,
MSDOS.csv 000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,

0x2c は、上記の CSV の区切り文字です。最後の行には、終端の 0x0D 0x0A (CSV)、0x0d (MAC)、または 0x0D 0x0A (MSDOS) が付かないことに注意してください。Excel が末尾に 0x0D 0x0A を追加して、コードで CR や LF が解析を続行するために使用されている場合に処理ロジックが壊れるのを目撃したことがあるため、これは意外なことです。

00000530: 2c-- --34 3045 4330 30-- ---- --2c 3138  ,--40EC00----,18
00000540: 390d 0a                                  9..

注: これは実際の Excel ファイルからのものであるため、「--」は編集されています。

このような出力は、VB などの MS 生産性ツール内での CSV ファイルのスクリプト生成から生成されたものと思われます。

空っぽなら、すべて空っぽ

stat -f "%z %N" *EMPTY.csv   
0 CSV_EMPTY.csv
0 MAC_EMPTY.csv
0 MSDOS_EMPTY.csv

(macOS 12.6 統計 Brown 他)

 for file in *.csv; do echo $file" "; xxd $file | tail -2; done
CSV.csv 
000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,
MAC.csv
00001260: 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c 0d2c 2c2c  .,,,.,,,.,,,.,,,
00001270: 0d2c 2c2c                                .,,,
MSDOS.csv
000012b0: 0d0a 2c2c 2c0d 0a2c 2c2c 0d0a 2c2c 2c0d  ..,,,..,,,..,,,.
000012c0: 0a2c 2c2c                                .,,,

文字エンコードの違いについては、この Stack Exchange の質問の別の場所で回答されています。

しかし、Excelには「CSV」を保存する4番目の方法があり、「CSV UTF-8」になります。

file UTF8_EMPTY.csv 
UTF8_EMPTY.csv: Unicode text, UTF-8 text, with no line terminators
file UTF8.csv      
UTF8.csv: Unicode text, UTF-8 (with BOM) text, with CRLF line terminators

ここでは、fileより詳細かつ具体的です。ファイル バイトは次のように表示されます。

xxd UTF8_EMPTY.csv 
00000000: efbb bf                                  ...
xxd UTF8.csv      
00000000: efbb bf31 2c32 2c33 0d0a 342c 352c 36    ...1,2,3..4,5,6

したがって、最初の 3 バイト (バイト オーダー マーカー) は適切であることがわかります。また、UTF-8 でエンコードされた CSV ファイルは CR LF 終了を使用していますが、これも最後のレコードには適用されていないことがわかります。

最後に、違いについてはさらに検討すべき点があります。前述のように、文字エンコード、実際の区切り文字、ローカリゼーションによる影響、区切り文字に一致する値の引用符付けなどが思い浮かびます。

11 年経った今、データ交換のために人間が作成した CSV ファイルをプログラムで取り込むために「CSV」を使用したいと考えている人たちに、この教訓を伝えることは有益だと感じました。この Stack Exchange の質問には、このような野心に対する正確なファイル形式の回答がないことに気付きました。

関連情報