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

csv formatting microsoft-excel string text-formatting

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

e.g.:

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

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


EDIT: 質問の意図を明確にしました、混乱させてすみません

  78  None  2011-08-03


ベストアンサー

ソースデータを管理している人にとっては、どうやらCSV欄がこの形式でないとExcelが自動検出してしまうようです

"=""Data Here"""

eg…

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!)

87  Simon East  2011-08-03


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

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

  • すべての値を二重引用符で囲んでも意味がありません
  • すべての値をダブルクォートに入れた後、その前に=を置くことは助けになりますが、他のほとんどのアプリケーションではcsvファイルが役に立たなくなります
  • すべての値の周りの二重引用符の周りに括弧をつけるのはゴミです
  • すべての値の前にスペースを入れてから二重引用符で囲むことで、日付への変換を防ぐことができますが、先頭のゼロや末尾のゼロのトリミングを防ぐことはできません
  • 値の前に単一の引用符を付けることは、Excel内でデータを入力する場合にのみ機能します

However:

すべての値を二重引用符で囲む前にタブを置くことで、日付への変換を防ぐことができますし、先頭または末尾のゼロのトリミングを防ぐことができます

E.g.:

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

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

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

44  ajabo  2014-01-20


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

Excel 2007/2010では、DataGet External DataFrom Textとなっています。 または、Excel 2003では、DataImport External DataImport Dataとなっています

後者の2つの列をテキストとしてインポートしている様子を示す、Excel 2003のテキスト インポート ウィザードのイメージです

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

23  DMA57361  2011-08-03


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の規約ではないかと思います

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

2  Shane  2013-01-13


問題のテキストが長すぎるとサイモンの回答に問題がありました(Excelのバグによるものだと思います。https://superuser.com/a/776614/1084793).文字列の中にカンマがある場合、シェーンの回答はうまくいきませんでした

また、テストに改行文字が含まれている場合に=を使用することにも問題がありました

どちらの場合も(長い場合や改行がある場合)、いずれにしてもExcelが正しく解釈してくれることを期待しています

ということで、現在、私が使っているC#のコードはこれです

private string content;
public String Content
{
get
{
// escape double-quotes first, to get the right length of the output
string output = content.Replace("\"", "\"\"\"\"");
if (output.Length > 255 || content.Contains("\n"))
{
// just output with double-quotes ("hello")
return "\"" + content.Replace("\"", "\"\"") + "\"";
}
else
{
// output with the equals ("=""hello""")
return "\"=\"\"" +
output +
"\"\"\"";
}
}
set
{
content = value;
}
}

これは今のところ、私のシナリオのすべてで動作しています。もし誰かがまだ “=” メソッドを使用している改行や 255 文字の問題を回避する方法を持っているならば、私は非常に興味があります

0  richjhart  2020-07-22


Excelで日付をテキストとして強制的に解釈させる簡単な方法は、以下のように完全引用符を使わずに、日付の前に単一の引用符を付けることです

’10/11/2002

CSVを開くのではなく、インポートできるのであれば、各列の形式をExcelに伝えることができます。私が質問したこの質問を見てみてください

-1  hdhondt  2013-01-13


タイトルとURLをコピーしました