web-dev-qa-db-ja.com

Excelに値を文字列として解釈させるためのカンマ区切りCSVのフォーマット

Excelに値を文字列として解釈させ、それらを数値や日付に変換させないようにする方法でCSVファイルを出力する方法を見つけようと、しばらく探していました。

例えば。:

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

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


編集:私の質問の意図をはっきりさせ、混乱して申し訳ありません。

56
Simon East

ソースデータを管理している人のために、CSVカラムがこのフォーマットでない限り、Excelは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"""



(編集:訂正を加えて更新、ありがとうDMA57361!)

58
Simon East

多くの人と同様に、私はマイクロソフトが下すのと同じ決定に苦労しており、提案されたさまざまな解決策を試してみました。

Excel 2007の場合、次のようになります。

  • すべての値を二重引用符で囲んでも意味がありません
  • 二重引用符で囲んだ後にすべての値の前に=を付けると、他のほとんどのアプリケーションではcsvファイルが役に立たなくなります。
  • すべての値を二重引用符で囲むことはゴミです
  • 二重引用符を囲む前にすべての値の前にスペースを入れると、日付への変換が妨げられますが、先頭または末尾のゼロの切り捨ては妨げられません。
  • 値の前に一重引用符を付けるのは、Excelにデータを入力するときだけです。

しかしながら:

二重引用符を囲む前にすべての値の前にタブを配置すると、日付への変換が妨げられ、先頭または末尾のゼロのトリミングが妨げられ、各セルの左上隅に厄介な警告マーカーも表示されません。

例えば。:

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

タブ文字は二重引用符で囲む必要があります。編集:それは二重引用符も必要ではないことがわかった。

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

33
ajabo

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

Excel 2007/2010ではDataGet External DataFrom Textとして見つけることができます。
またはExcel 2003ではDataImport External DataImport Dataです。

これは、与えられたサンプルデータに対して実行中のExcel 2003のテキストインポートWizardの画像です。後者の2列をテキストとしてインポートしたところです。

Excel 2003: Text Import Wizard on Step 3 - data types

21
DMA57361

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""",で、これはVisual Basicの慣習かもしれないと思います。

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

1
Shane