フォーマットを壊すことなくCSV列にカンマを含める方法はありますか?


282

名前と番号を含む2列のCSVがあります。一部の人の名前にはカンマが使用されています。たとえば、Joe Blow, CFA.このカンマは新しい列として解釈されるため、CSV形式を壊します。

私が読んだところ、最も一般的な処方箋は、その文字を置き換えるか、区切り文字を新しい値(たとえばthis|that|the, other)に置き換えることです。

私は本当にコンマ区切り文字を保持したいと思います(Excelは他の区切り文字をサポートしていますが、他のインタープリターはサポートしていないことを知っています)。Joe Blow| CFAばかげているように見えるので、名前にコンマを付けておきたいと思います。

エスケープするなどして、フォーマットを壊さずにCSV列にカンマを含める方法はありますか?



私のために働いた小さなハック:テキストエディターでcsvファイルを開いて、Excelドキュメントに貼り付けます。大きなチャンクでこれを行うことができれば機能します。
ジョナス

@ジョナス:同じトークンが区切り文字として使用されているか、データの一部として使用されているかは、Excelでは推測できません。テキストエディタから貼り付けても変更されません。
IInspectable 2017

回答:


370

たとえば、フィールドを引用符で囲みます。

field1_value,field2_value,"field 3,value",field4, etc...

ウィキペディアを参照してください。

更新

引用符をエンコードするには、を使用します"。フィールド内の1つの二重引用符はとしてエンコードされ""、フィールド全体がになり""""ます。たとえば、Excelで次のように表示された場合:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

CSVファイルには次のものが含まれます。

regular_value,",,,""",","""",","""""""",""""

コンマは単に引用符を使用してカプセル化されるため、に,なり","ます。

コンマと引用はカプセル化して引用する必要があるため、に","なり""","""ます。


4
これは私のために働いた!私はjs変数をCSVにエクスポートし、すべての文字列を二重引用符で囲んで、質問で述べた「John Blow、CFA」の問題を解決しました。
Madhulika Mukherjee

各セル内に引用符とコンマの両方がある場合はどうなりますか?
スピードプレーン2016

2
私はいくつかの例で回答を更新しました-簡単に言うと、コンマは引用符で囲まれ(など",")、引用符はエスケープされます(例:"""
Ryan

6
これは、99%のユースケースを解決する可能性のある優れたソリューションを提案するため、これが受け入れられる答えになるはずです。
BuZz

引用エスケープされたフィールドを持つcsvファイルを解析するC#ライブラリはありますか?
Minh Tran

34

CSV形式の問題は、仕様が1つではないこと、受け入れられる方法がいくつかあり、どちらを使用するかを区別する方法がない(生成/解釈用)ことです。文字をエスケープするすべての方法(その場合は改行ですが、基本的な前提は同じ)については、別の投稿で説明しました。基本的には、対象となるユーザーに対してCSV生成/エスケーププロセスを使用することに帰着し、残りは気にしないことを望みます。

参照仕様書


10
RFC 4180、Comma-Separated Value(CSV)ファイルの共通形式とMIMEタイプ、ietf.org / rfc / rfc4180.txt ; さらに1つの「公式」仕様。
Shi

3
最も広く受け入れられているアプローチを含めると、これは素晴らしい答えになります。現状では、@ Ryanの回答が優先されます。
rinogo

16

あなたが言ったことを作りたいなら、あなたは引用符を使うことができます。このようなもの

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

これで、名前変数でカンマを使用できるようになりました。


先端をありがとう、それはそれをしました: $whatever = "\"".$name."\"";
washere

解決策をありがとう。
Bhavin Thummar

10

その値を引用する必要があります。
これはより詳細な仕様です。


2
複数の仕様があります。Excelはエントリを引用符で囲み、Linuxはバックスラッシュ文字を使用します。残念ながら、目的のオーディエンス/ターゲットシステムにエスケープする必要があります。
Rudu

7

他の回答のポイントに加えて、Excelで引用符を使用している場合に注意する必要があるのは、スペースの配置です。次のようなコード行がある場合:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excelは、コンマをエスケープするために使用するのではなく、最初の引用をリテラル引用として扱います。コードを次のように変更する必要があります

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

ここに私を連れて行ったのはこの微妙さでした。


3

私は同じ問題に直面し、それを引用し,ても役に立たなかった。結局、私は交換し,+、OUTFILEに出力を保存し、交換し、処理を終え+,。これは醜く見えるかもしれませんが、私にとってはうまくいきました。


2
データに「+」文字が含まれている場合はどうしますか?
Andrew Morton

1
@AndrewMortonはい、それは挑戦です。しかし、私の場合+は、データにまったく存在しないと確信しています。親切なコメントありがとうございます。
Mohammed

4
シンプルで堅牢な方法は、文字列を二重引用符で囲み、文字列内で二重引用符を2つ使用してエスケープすることです""。これが通常の方法です。
Andrew Morton、

1
機能しない場合は、区切りカンマの横にスペースを生成していないことを確認してください。「カエル」、「黄、緑」は機能します「カエル」、「黄、緑」は機能しません
Dazbert

個人的に私はここで@AndrewMortonの2番目のコメントを見つけました。これは実際に、受け入れられた回答よりも優れている点を理解するのに役立ちました。ステップ1-データフィールド内の二重引用符をエスケープする(例:Python):field = field.replace('"', '""')ステップ2-ステップ1の後、フィールド自体を二重引用符で囲みfield = '"' + field + '"'ます。
ウィル・クロックスフォード

3

言語によっては、to_jsonメソッドを使用できる場合があります。それはCSVを壊す多くのものを逃れるでしょう。


3

MacのNumbersなどの一部のアプリケーションでは、その前にスペースがあると二重引用符が無視されることがわかりました。

a, "b,c"動作中は動作しませんa,"b,c"


1
たぶん私は1時間の仕事を節約できた...ありがとう
Shaun314

1

たとえば、PHP base64_encode($ str)/ base64_decode($ str)で値をエンコードできます

IMOこれは引用符を2倍にするよりも簡単です。

https://www.php.net/manual/en/function.base64-encode.php

エンコードされた値にコンマが含まれることはないため、CSV内のすべてのコンマが区切り文字になります。



0

Text_Qualifierフラットファイル接続マネージャーのフィールドをとして使用できます"。これはデータを引用符で囲み、引用符の外にあるコンマでのみ区切る必要があります。


0

まず、アイテムの値に二重引用符( ")が含まれている場合は、2つの二重引用符(" ")に置き換えます。

item = item.ToString().Replace("""", """""")

最後に、wrapアイテムの値:

左:二重引用符( ")付き

右:二重引用符( ")とコンマ文字(、)

csv += """" & item.ToString() & ""","

0

二重引用符は機能しませんでした\"。例として二重引用符を配置する場合は、を設定できます\"\"

例として、式を作成できます。

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

csvに書き込みます:

= IF(C3 = 1、 ""、B3)


0

ここでは必要ないかもしれませんが、それは非常に古い質問であり、答えは他の人を助けるかもしれません。別のセパレータを使用してExcelにインポートすると便利なヒントは、ファイルをテキストエディタで開き、次のような最初の行を追加することです。

sep = |

どこ| Excelで使用するセパレーターです。または、Windowsのデフォルトのセパレータを変更することもできますが、少し時間がかかります。

[コントロールパネル]> [時計と地域]> [地域]> [書式]> [追加]> [数字]> [リスト区切り記号](カンマから任意の選択肢に変更)。つまり、Excelもデフォルトで、選択したセパレーターを使用してCSVをエクスポートします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.