Apakah ada cara untuk memasukkan koma di kolom CSV tanpa merusak format?

283

Saya punya CSV dua kolom dengan nama dan nomor. Beberapa nama orang menggunakan koma, misalnya Joe Blow, CFA.Koma ini memecah format CSV, karena ditafsirkan sebagai kolom baru.

Saya sudah membaca dan resep yang paling umum tampaknya menggantikan karakter itu, atau mengganti pembatas, dengan nilai baru (misalnya this|that|the, other).

Saya benar-benar ingin menjaga pemisah koma (saya tahu excel mendukung pembatas lain tetapi penerjemah lain mungkin tidak). Saya juga ingin menyimpan koma dalam nama, karena Joe Blow| CFAterlihat cukup konyol.

Apakah ada cara untuk memasukkan koma dalam kolom CSV tanpa memecah format, misalnya dengan menghindarinya?

buley
sumber
1
Kemungkinan duplikat Berurusan dengan koma dalam file CSV
Ciro Santilli 郝海东 冠状 病 六四 事件 事件
Peretasan kecil yang berhasil bagi saya: buka file csv di editor teks, lalu tempel ke dokumen excel. Bekerja jika Anda bisa melakukan ini dalam potongan besar.
Jonas
@Jonas: Excel tidak dapat menebak, apakah token yang sama digunakan sebagai pembatas atau bagian dari data. Menempel dari editor teks tidak mengubah itu.
IInspectable

Jawaban:

373

Lampirkan bidang dalam tanda kutip, misalnya

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

Lihat wikipedia .

Diperbarui :

Untuk menyandikan kuotasi, gunakan ", satu simbol kuotasi ganda dalam bidang yang akan dikodekan sebagai "", dan seluruh bidang akan menjadi """". Jadi, jika Anda melihat yang berikut ini misalnya dalam Excel:

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

file CSV akan berisi:

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

Koma hanya dienkapsulasi menggunakan tanda kutip, jadi ,menjadi ",".

Sebuah koma dan kebutuhan kutipan untuk dikemas dan dikutip, sehingga ","menjadi """,""".

Ryan
sumber
4
Ini berhasil untuk saya! Saya mengekspor variabel js ke CSV, dan memberikan sepasang tanda kutip tambahan di setiap string, membantu menyelesaikan masalah "John Blow, CFA", seperti yang disebutkan dalam pertanyaan.
Madhulika Mukherjee
Bagaimana jika ada tanda kutip dan koma di dalam setiap sel?
speedplane
2
Saya memperbarui jawaban dengan beberapa contoh - singkatnya, koma dienkapsulasi dalam tanda kutip (seperti ","), dan tanda kutip lolos (mis. """)
Ryan
6
Sekarang INI harus menjadi jawaban yang diterima karena mengusulkan solusi hebat yang kemungkinan dapat menyelesaikan 99% kasus penggunaan.
BuZz
Apakah ada pustaka C # untuk mem-parsing file csv dengan bidang kutipan-lolos?
Minh Tran
34

Masalah dengan format CSV, apakah tidak ada satu spec, ada beberapa metode yang diterima, tanpa cara membedakan mana yang harus digunakan (untuk menghasilkan / menginterpretasikan). Saya membahas semua metode untuk melarikan diri karakter (baris baru dalam kasus itu, tetapi premis dasar yang sama) di pos lain . Pada dasarnya ia menggunakan proses generasi CSV / melarikan diri untuk pengguna yang dituju, dan berharap yang lain tidak keberatan.

Dokumen spesifikasi referensi .

Rudu
sumber
10
RFC 4180, Format Umum dan Jenis MIME untuk File Comma-Separated Values ​​(CSV), ietf.org/rfc/rfc4180.txt ; satu lagi spesifikasi 'resmi'.
Shi
3
Memasukkan pendekatan yang paling banyak diterima akan membuat ini jawaban yang bagus. Seperti berdiri, jawaban oleh @Ryan menang.
rinogo
16

Jika Anda ingin membuat yang Anda katakan, Anda dapat menggunakan tanda kutip. Sesuatu seperti ini

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

jadi sekarang, Anda dapat menggunakan koma dalam variabel nama Anda.

Awan
sumber
Terima kasih Cloud atas tip Anda, yang berhasil: $whatever = "\"".$name."\"";
mana
Terima kasih atas solusinya.
Bhavin Thummar
10

Anda perlu mengutip nilai-nilai itu.
Berikut adalah spesifikasi yang lebih rinci.

Slaks
sumber
2
Ada beberapa spesifikasi, Excel menggunakan tanda kutip di sekitar entri, Linux menggunakan karakter backslash. Sayangnya, Anda perlu melarikan diri untuk audiens / sistem target yang Anda inginkan.
Rudu
7

Selain poin dalam jawaban lain: satu hal yang perlu diperhatikan jika Anda menggunakan kutipan di Excel adalah penempatan spasi Anda. Jika Anda memiliki baris kode seperti ini:

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

Excel akan memperlakukan kutipan awal sebagai kutipan literal alih-alih menggunakannya untuk menghindari koma. Kode Anda perlu diubah menjadi

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

Kehalusan inilah yang membawaku ke sini.

lebih lagi
sumber
3

Saya menghadapi masalah yang sama dan mengutipnya ,tidak membantu. Akhirnya, saya mengganti ,dengan +, menyelesaikan pemrosesan, menyimpan output ke file outfile dan mengganti +dengan ,. Ini mungkin terlihat jelek tapi itu berhasil untuk saya.

Mohammed
sumber
2
Dan apa yang akan Anda lakukan jika data berisi karakter "+"?
Andrew Morton
1
@AndrewMorton Ya, itu tantangan. Tetapi dalam kasus saya, saya yakin itu +tidak ada dalam data saya sama sekali. Terima kasih atas komentar Anda.
Mohammed
4
Cara sederhana dan kuat adalah dengan melampirkan string dalam tanda kutip ganda dan melarikan diri tanda kutip ganda dalam string dengan menggunakan dua dari mereka suka "". Ini adalah cara normal untuk melakukannya.
Andrew Morton
1
Jika tidak berfungsi, periksa apakah Anda tidak menghasilkan spasi di samping koma pembatas Anda: "Frog", "yellow, green" akan berfungsi "Frog", "yellow, green" tidak akan
Dazbert
Secara pribadi saya menemukan @AndrewMorton komentar kedua di sini sebenarnya membantu saya memahami apa yang lebih baik daripada jawaban yang diterima. Langkah 1 - keluar dari tanda kutip ganda di bidang data, mis. Dengan Python: field = field.replace('"', '""')Langkah 2 - setelah Langkah 1, sertakan bidang itu sendiri dalam tanda kutip ganda misalnya field = '"' + field + '"'- maka Anda adalah pemain besi, saya pikir.
Will Croxford
3

Bergantung pada bahasa Anda, mungkin ada metode to_json yang tersedia. Itu akan luput dari banyak hal yang merusak CSV.

amiksch
sumber
3

Saya menemukan bahwa beberapa aplikasi seperti Numbers in Mac mengabaikan kuotasi ganda jika ada ruang sebelumnya.

a, "b,c"tidak bekerja sambil a,"b,c"bekerja.

mudin
sumber
1
Anda mungkin hanya menyelamatkan saya satu jam kerja ... terima kasih!
Shaun314
1

Anda dapat menyandikan nilai-nilai Anda, misalnya dalam PHP base64_encode ($ str) / base64_decode ($ str)

IMO ini lebih sederhana daripada menggandakan kutipan, dll.

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

Nilai yang dikodekan tidak akan pernah mengandung koma sehingga setiap koma di CSV Anda akan menjadi pemisah.

Kevin
sumber
1

Anda dapat menggunakan Templat literal (string Templat)

misalnya -

`"${item}"`
सत्यमेव जयते
sumber
1
Bekerja seperti pesona!
waliurjs
0

Anda dapat menggunakan Text_Qualifierbidang di manajer koneksi file flat Anda sebagai ". Ini harus membungkus data Anda dalam tanda kutip dan hanya dipisahkan dengan koma yang berada di luar tanda kutip.

sakshi jain
sumber
0

Pertama, jika nilai item memiliki karakter tanda kutip ganda ("), ganti dengan 2 karakter tanda kutip ganda (" ")

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

Akhirnya, bungkus nilai barang:

ON LEFT: Dengan karakter kutipan ganda (")

ON KANAN: Dengan karakter kutipan ganda (") dan karakter koma (,)

csv += """" & item.ToString() & ""","
LifeiSHot
sumber
0

Kutipan ganda tidak bekerja untuk saya, itu bekerja untuk saya \". Jika Anda ingin menempatkan tanda kutip ganda sebagai contoh, Anda dapat mengatur \"\".

Anda dapat membuat rumus, sebagai contoh:

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

akan menulis dalam csv:

= JIKA (C3 = 1, "", B3)

ahli matematika
sumber
0

Mungkin bukan yang dibutuhkan di sini, tetapi ini adalah pertanyaan yang sangat lama dan jawabannya dapat membantu orang lain. Kiat yang menurut saya berguna dengan mengimpor ke Excel dengan pemisah yang berbeda adalah dengan membuka file dalam editor teks dan menambahkan baris pertama seperti:

sep = |

dimana | adalah pemisah yang ingin Excel gunakan. Atau Anda dapat mengubah pemisah default di Windows tetapi agak bertele-tele:

Panel Kontrol> Jam & wilayah> Wilayah> Format> Tambahan> Nomor> Pemisah daftar [ubah dari koma ke alternatif pilihan Anda]. Itu berarti Excel juga akan default untuk mengekspor CSV menggunakan pemisah yang dipilih.

pengguna25307
sumber