Hindar dari penawaran ganda dalam CSV


164

Saya memiliki garis seperti ini di CSV saya:

"Samsung U600 24"","10000003409","1","10000003427"

Kutipan di sebelah 24digunakan untuk mengekspresikan inci, sedangkan kutipan di sebelah kutipan itu menutup kolom. Saya membaca baris dengan fgetcsvtetapi parser membuat kesalahan dan membaca nilainya sebagai:

Samsung U600 24",10000003409"

Saya mencoba meletakkan backslash sebelum kutipan inci, tetapi kemudian saya hanya mendapatkan backslash dalam nama:

Samsung U600 24\"

Apakah ada cara untuk menghindari ini dengan benar di CSV, sehingga nilainya akan Samsung U600 24", atau apakah saya harus memasukkannya kembali ke prosesor?


21
Cukup gandakan penawaran Anda. Itu saja
Akal Sehat Anda

Jawaban:


281

Gunakan 2 kutipan:

"Samsung U600 24"""

102
RFC-4180, paragraf "Jika tanda kutip ganda digunakan untuk melampirkan bidang, maka tanda kutip ganda yang muncul di dalam bidang harus diloloskan dengan mendahului dengan tanda kutip ganda."
tommed

4
Seperti yang dikatakan tommed, Anda hanya perlu menambahkan satu kutip ganda untuk menghindari kutip ganda. Anda dapat menggunakan alat baris perintah yang disebut csvfix untuk mendeteksi baris yang tidak sesuai: csvfix check -nl -v [nama file]
Sam Critchley

2
@SamCritchley Saya hanya melihat satu kutipan ganda digunakan untuk melarikan diri di sini. Dengan "Gunakan 2 kutipan", user4035 berarti 1 kutipan harus diganti dengan 2 kutipan. Dengan keluar dari tanda kutip ganda dengan tanda kutip ganda, Anda secara efektif membuat pasangan tanda kutip ganda (2 tanda kutip ganda). Kutipan terakhir yang Anda lihat di akhir adalah untuk mengakhiri bidang.
Zenexer

1
tunggal, ganda, ganda, kutip tunggal diperlukan, tetapi hanya jika dilanjutkan dengan kutipan ganda tunggal ... semoga berhasil!
Daniel Waltrip

14

Tidak hanya tanda kutip ganda, Anda akan membutuhkan tanda kutip tunggal ( '), tanda kutip ganda ( "), garis miring terbalik ( \) dan NUL (byte NULL).

Gunakan fputcsv()untuk menulis, dan fgetcsv()membaca, yang akan mengurus semuanya.


3
Komentar ini pada halaman dokumentasifputcsv() menunjukkan bagaimana Anda dapat menggunakannya fputcsv()ketika Anda ingin menampilkan dalam format csv ke browser alih-alih file yang sebenarnya.
dennisschagt

15
@Angelin Nadar, bisakah Anda menambahkan sumber ke klaim Anda tentang perlunya menggandakan penawaran tunggal, backslash, dan NUL? Saya tidak menemukannya di RFC-4180 .
Petr 'PePa' Pavel

2
Anda tidak perlu benar-benar keluar dari tanda kutip tunggal dll. File CSV yang tepat bahkan tidak perlu menambahkan tanda kutip ganda di sekitar bidang yang hanya berisi tanda kutip tunggal. Jika pembaca CSV diimplementasikan dengan benar, ia harus membaca file dengan benar bahkan dengan simbol-simbol itu.
xji

4
Mengapa jawaban ini pernah dipilih? Komentar tentang melarikan diri karakter tidak pernah didukung dan pertanyaan asli tidak bertanya tentang PHP. Tampaknya ini hanya berlaku untuk pembatas string (dan hanya untuk pembatas yang dipilih) ketika sebuah program, seperti Open Office, memungkinkan Anda untuk mengubahnya.
Dave F

0

Saya tahu ini adalah posting lama, tapi inilah cara saya menyelesaikannya (bersama dengan mengonversi nilai null ke string kosong) di C # menggunakan metode ekstensi.

Buat kelas statis dengan sesuatu seperti berikut:

    /// <summary>
    /// Wraps value in quotes if necessary and converts nulls to empty string
    /// </summary>
    /// <param name="value"></param>
    /// <returns>String ready for use in CSV output</returns>
    public static string Q(this string value)
    {
        if (value == null)
        {
            return string.Empty;
        }
        if (value.Contains(",") || (value.Contains("\"") || value.Contains("'") || value.Contains("\\"))
        {
            return "\"" + value + "\"";
        }
        return value;
    }

Lalu untuk setiap string yang Anda tulis ke CSV, alih-alih:

stringBuilder.Append( WhateverVariable );

Anda hanya melakukan:

stringBuilder.Append( WhateverVariable.Q() );

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.