CSV'de çift tırnak işareti


164

CSV'imde böyle bir satır var:

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

Yanındaki alıntı 24inç ifade etmek için kullanılırken, o teklifin hemen yanındaki alıntı alanı kapatır. Ben çizgi ile okuyorum fgetcsvama ayrıştırıcı bir hata yapar ve değeri şöyle okur:

Samsung U600 24",10000003409"

İnç alıntısından önce bir ters eğik çizgi koymayı denedim, ama sonra sadece adında bir ters eğik çizgi alıyorum:

Samsung U600 24\"

CSV'de bu durumdan düzgün bir şekilde kaçmanın bir yolu var mı, bu yüzden değer olur mu Samsung U600 24", yoksa işlemcide regex yapmak zorunda mıyım?


21
Sadece teklifinizi ikiye katlayın. Hepsi bu
Ortak Duygunuz

Yanıtlar:


282

2 alıntı kullanın:

"Samsung U600 24"""

102
RFC-4180, paragraf "Alanları kapatmak için çift tırnak işareti kullanılıyorsa, bir alanın içinde görünen çift tırnaktan önce başka bir çift tırnak işareti konarak kaçılmalıdır."
16'da tommed

4
Tommed'in dediği gibi, çift tırnaktan kaçmak için tek bir çift tırnak eklemeniz yeterlidir. Uymayan satırları tespit etmek için csvfix adlı bir komut satırı aracı kullanabilirsiniz: csvfix check -nl -v [dosyaadı]
Sam Critchley

2
@SamCritchley Burada kaçmak için kullanılan tek bir çift alıntı görüyorum. "2 tırnak kullan" ile user4035, 1 tırnak 2 tırnak ile değiştirilmelidir. Çift tırnak işareti içeren çift tırnak işaretlerinden kaçarak etkili bir şekilde çift tırnak çiftleri oluşturursunuz (2 çift tırnak). Sonunda gördüğünüz son alıntı alanı sonlandırmaktır.
Zenexer

1
tek, çift, çift, tek, çift tırnak, ancak gereklidir, ancak sadece bir çift tek, çift tırnak ile devam ... iyi şanslar!
Daniel Waltrip

14

Sadece çift tırnaklar için değil, tek tırnak ( '), çift tırnak ( "), ters eğik çizgi ( \) ve NUL (NULL bayt) ihtiyacınız olacaktır.

Her şeyi halletmek fputcsv()için yazmak ve fgetcsv()okumak için kullanın .


3
Doküman sayfasındaki fputcsv()bu yorum , fputcsv()csv biçiminde gerçek bir dosya yerine tarayıcıya çıktı almak istediğinizde nasıl kullanabileceğinizi gösterir .
dennisschagt

15
@Angelin Nadar, lütfen tek teklif, ters eğik çizgi ve NUL'u ikiye katlama ihtiyacıyla ilgili talebinize bir kaynak ekleyebilir misiniz? RFC-4180'de bulamadım .
Petr 'PePa' Pavel

2
Aslında tek tırnak vb kaçmak gerekmez. Düzgün bir CSV dosyası sadece tek tırnak içeren bir alanın etrafında çift tırnak eklemek bile gerekmez. CSV okuyucu düzgün şekilde uygulanırsa, bu sembollerle bile dosyayı doğru okumalıdır.
xji

4
Bu cevap neden hiç oylanmadı? Kaçan karakterlerle ilgili yorum asla yedeklenmedi ve orijinal soru PHP hakkında soru sormuyor. Bu, yalnızca Open Office gibi bir program değiştirmenize izin verdiğinde dize sınırlayıcı (ve yalnızca seçilen sınırlayıcı için) için geçerli gibi görünmektedir.
Dave F

0

Bu eski bir yazı olduğunu biliyorum, ama işte nasıl bir uzantı yöntemi kullanarak (boş değerleri boş dizeye dönüştürme ile birlikte) C # çözüldü.

Aşağıdaki gibi bir şeyle statik bir sınıf oluşturun:

    /// <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;
    }

Ardından, CSV'ye yazdığınız her dize için:

stringBuilder.Append( WhateverVariable );

Siz sadece yapın:

stringBuilder.Append( WhateverVariable.Q() );

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.