himorogiの日記

主にプログラミングに関することなど。少々ハード(電子工作)についても。

Excel WorkBook をテキストとして保存する場合の挙動の違い

Unicode テキスト(*.txt)

Excelから
ファイル[名前を付けて保存]
ファイルの種類[Unicode テキスト(*.txt)]
を選択すると、Unicode(UTF-16 LittelEndian/BOM付き/Tab区切り)テキストとして保存される。
この時、

  1. Cell 中に含まれるHT:horizontal tabulation("\t":u+0009)はwhite space(" ":u+0020)に置換される。
  2. Cell 中にcomma(",")若しくはdouble qutation('"')若しくはLF(u+000A)が含まれるときは、Cell の内容を'"' で囲う
  3. 改行は CRLF("\r\n"(u+000D+000A))

Unicode テキスト(*.txt)として保存された場合、Cell中のtab("\t":u+0009)は空白(" ":u+0020)に置換されるため、Unicode テキスト内に出現するtab("\t":u+0009)は必ず区切り文字である。
データ交換として、他のシステムに渡すため、区切り文字を相手のシステムに合わせて変更する必要がある場合は、単純にtab("\t":u+0009)をリプレースするだけで済む。
予めセル(フィールド、カラム)中のtabが空白に置換されるので、データ透過性は保持されないという問題はあるが、Excelの[名前を付けて保存]で選択できる出力形式の中では、データ交換形式としては一番マシ。

CSV(カンマ区切り)(*.txt)

Excelから
ファイル[名前を付けて保存]
ファイルの種類[CSV(カンマ区切り)(*.txt)]
を選択すると、CSV(Shift-JIS/Comma区切り)テキストとして保存される。
この時、

  1. Cell 中に含まれるHT:horizontal tabulation("\t":0x09)は white space(" ":0x20)に置換される。
  2. Cell 中にcomma(",")若しくはdouble qutation('"')若しくはLF(0x0A)が含まれるときは、Cell の内容を'"'で囲う
  3. 改行はCRLF("\r\n":0x0D0A)

Excel同士でのやり取りならば、ExcelCSV(カンマ区切り)(*.txt)出力でも、Cell中の改行(LF)と、レコードの改行(CRLF)は識別されるが、データ交換後に他のアプリケーションやプログラムでファイルを開き→保存しなおすと、大抵の場合、改行コードは統一されてしまう(LF→CRLFか、CRLF→LFの何れかが行われることが多い)。
その結果、Excel上でセル内の改行と、レコードの改行が識別できていても、他のシステムで保存された後はセル(フィールド、カラム)中の改行とレコードの改行が識別できなくなってしまう。
Excel同士でやり取りする場合を除き、データ交換フォーマットとして使ってはいけない。

テキスト(スペース区切り)(*.prn)

ファイル[名前を付けて保存]
ファイルの種類[テキスト(スペース区切り)(*.prn)]
を選択すると、スペース区切り(Shift-JIS)テキストとして保存される。

  1. Cell 中にHT:horizontal tabulation("\t":0x09)が出現するとHT:horizontal tabulation("\t":0x09)以降の内容は無視される(出力されない)
  2. 区切りのwhite space(" ":0x20)はカラム毎に桁揃えされる(セルの内容の文字数が不揃いの場合、次のカラムの先頭の桁が揃うよう、セル内容に続く区切りのwhite spaceが増減する)
  3. Cell 中にcomma(",")若しくは double qutation('"') 若しくは LF(0x0A)が含まれていても、cell の内容を'"'で囲わない!!!
  4. 改行はCRLF("\r\n":0x0D0A)

即ち、[テキスト(スペース区切り)(*.prn)]で保存した場合、元の内容と一致しなくなる。
Excel同士の場合も含めてデータ交換のためのフォーマットとしては絶対に使ってはいけない。