2011-08-03 08:39:00 +0000 2011-08-03 08:39:00 +0000
64
64

カンマ区切りのCSVをフォーマットして、Excelが値を文字列として解釈するように強制する

Excelが値を文字列として解釈し、数値や日付に変換しようとしないように強制的にCSVファイルを出力する方法を考えようと、しばらく探し回っていました。

例えば

"141", "10/11/2002", "350.00", "1311742251"

Excelはこれらすべてをネイティブの日付/数字形式に「インテリジェントに」変換しようとします。これを回避する方法はありますか?


_EDIT: 質問の意図を明確にしました。

回答 (5)

70
70
70
2011-08-03 08:39:57 +0000

ソースデータを管理している人のために、どうやらExcelはCSVカラムがこの形式でない限り、CSVフィールドの形式を自動検出してしまうようです。

"=""Data Here"""

例:

20, 5.5%, "0404 123 351", "3-6", "=""123"""
[number] [percent] [number] [date] [string] <-- how Excel interprets

Googleスプレッドシートでも動作しますが、他のスプレッドシートアプリがこの表記法をサポートしているかどうかは不明です。

データに引用符が含まれていると思われる場合は、以下のようにダブルエスケープする必要があります…

"=""She said """"Hello"""" to him"""

(EDIT: 修正を加えて更新しました。ありがとう DMA57361!)

39
39
39
2014-01-20 13:02:48 +0000

多くの人と同じように、私もマイクロソフトの判断に悩まされ、様々な提案された解決策を試してきました。

Excel 2007の場合は以下のようになります。

  • すべての値を二重引用符で囲むことは何の役にも立ちません
  • すべての値を二重引用符で囲んだ後に、その前に=を置くことは有効ですが、他のほとんどのアプリケーションではcsvファイルが役に立たなくなります
  • すべての値を二重引用符で囲んだ後に括弧を置くことはゴミです
  • すべての値を二重引用符で囲んだ後に、その前にスペースを置くことは、日付への変換を防ぐことができますが、先頭または末尾のゼロのトリミングを防ぐことはできません
  • すべての値を二重引用符で囲んだ後に、その前にスペースを置くことは有効です。
  • 値の前に一重引用符を付けるのは、Excel内でデータを入力する場合にのみ有効です。

しかし:

すべての値の前にタブを付けてから二重引用符を付けると、日付への変換は防止されますが、先頭や末尾のゼロの切り取りは防止されますが、シートは各セルの左上隅に不快な警告マーカーを表示しません。

"<tab character><some value>","<tab character><some other value>"

タブ文字は二重引用符の中に入れなければならないことに注意してください。編集: 二重引用符は必要ないことがわかりました。

csvファイルをダブルクリックすると、Excelでファイルをスプレッドシートとして開くことができ、テキストデータのように上記のように扱われるすべての値を表示することができます。小数点として‘,’ではなく‘,’を使用するようにエクセルを設定しておかないと、csvファイルの全行が各行の最初のセルに1つのテキストとして表示されてしまいます。どうやらマイクロソフトは、CSVは「小数点以下の値ではない」分離された値を意味すると考えているようです。

22
22
22
2011-08-03 09:13:56 +0000

Excelのインポート機能を使用すると、各列の解釈すべき形式(自動、テキスト、または日付)を指定することができ、データファイルを修正する必要がありません。

Excel 2007/2010では、DataGet External DataFrom Text と表示されています。
または、Excel 2003ではDataImport External DataImport Data となります。

以下は、Excel 2003 のテキストインポートウィザードが、指定されたサンプルデータ上で動作しているときの画像で、後者の 2 つの列をテキストとしてインポートしている様子を示しています。

2
2
2
2013-01-13 22:37:27 +0000

Simon の例は私にはうまくいきませんでしたが、言語の違いだと思います。C#では、私の作業フォーマット文字列は以下のようになっています。

var linebreak = (i++ == list.Count) ? "" : "\r\n";

csv += String.Format("=\"{0}\",{1},{2},{3},=\"{4}\"{5}",
    item.Value, item.Status, item.NewStatus, item.Carrier, c.Status, linebreak);

そして、出力ファイルは以下のようになります。

="abababababab",INVALID,INVALID,USPS,="",
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9500100030492359000149",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793482982812",UNKNOWNSTATUS,DELIVERED,USPS,="3"
="9400110200793000216184",UNKNOWNSTATUS,INVALID,USPS,=""

見ての通り、出力ファイルのフォーマットは="VALUE",ではなく"=""VALUE""",となっています。

私はExcel2010を使用しています。ちなみに、Google Sheetsでは、このようなフォーマットのファイルを開いたり変換したりすることはできません。等号を取り除いて"VALUE",にすれば問題ありませんが、Excelはファイルを開きますが、列を文字列にしたいという事実は無視します。

-2
-2
-2
2013-01-13 23:23:56 +0000

Excelで日付をテキストとして解釈させる簡単な方法は、以下のように完全な引用符を使わずに、日付の前にシングルクォートを置くことです。

‘10/11/2002

CSVを開く代わりにインポートすることができれば、各列がどのような形式であるべきかをExcelに伝えることができます。私が質問したこの質問](https://superuser.com/questions/497367/how-to-force-excel-to-treat-dates-in-csv-as-text-in-a-macro)を見てみてください。