หลีกเลี่ยงคำพูดซ้ำใน CSV อย่างถูกต้อง


164

ฉันมีบรรทัดเช่นนี้ใน CSV ของฉัน:

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

อ้างถัดไปที่จะ24ถูกนำมาใช้ในการแสดงนิ้วในขณะที่อ้างติดกับใบเสนอราคาที่ปิดสนาม ฉันกำลังอ่านบรรทัดด้วยfgetcsvแต่ตัวแยกวิเคราะห์ทำผิดและอ่านค่าเป็น:

Samsung U600 24",10000003409"

ฉันพยายามใส่แบ็กสแลชก่อนที่นิ้วจะพูด แต่จากนั้นฉันเพิ่งได้แบ็กสแลชในชื่อ:

Samsung U600 24\"

มีวิธีที่จะหลบหนีสิ่งนี้อย่างถูกต้องใน CSV ดังนั้นค่าจะเป็นSamsung U600 24"หรือฉันต้อง regex ในโปรเซสเซอร์หรือไม่


21
เพียงแค่เพิ่มคำพูดของคุณ นั่นคือทั้งหมดที่
สามัญสำนึกของคุณ

คำตอบ:


282

ใช้ 2 คำพูด:

"Samsung U600 24"""

102
RFC-4180, วรรค "หากใช้เครื่องหมายอัญประกาศคู่เพื่อใส่เขตข้อมูลดังนั้นเครื่องหมายอัญประกาศคู่ที่ปรากฏในเขตข้อมูลจะต้องถูกหลีกเลี่ยงโดยนำหน้าด้วยเครื่องหมายคำพูดคู่อื่น"
tommed

4
ดังที่ tommed กล่าวว่าคุณเพียงแค่เพิ่มเครื่องหมายคำพูดคู่เดียวเพื่อหลีกเลี่ยงคำพูดคู่ คุณสามารถใช้เครื่องมือบรรทัดคำสั่งชื่อ csvfix เพื่อตรวจหาบรรทัดที่ไม่สอดคล้อง: csvfix check -nl -v [filename]
Sam Critchley

2
@ SamCritchley ฉันเห็นเพียงเครื่องหมายคำพูดคู่เดียวที่ใช้ในการหลบหนีที่นี่ โดย "ใช้ 2 อัญประกาศ" user4035 หมายความว่า 1 อัญประกาศควรแทนที่ด้วย 2 อัญประกาศ คุณสามารถสร้างคำพูดคู่ได้อย่างมีประสิทธิภาพ (2 เครื่องหมายคำพูดคู่) คำพูดสุดท้ายที่คุณเห็นในตอนท้ายคือการยุติสนาม
Zenexer

1
single double double double ต้องการการเสนอราคาเดียว แต่ถ้าดำเนินการโดยการอ้าง double double ครั้งเดียว ... ขอให้โชคดี!
Daniel Waltrip

14

ไม่เพียง แต่เครื่องหมายคำพูดคู่คุณจะต้องใช้เครื่องหมาย'คำพูดเดี่ยว ( "), เครื่องหมายคำพูดคู่ ( ), เครื่องหมายแบ็กสแลช ( \) และ NUL (ไบต์ NULL)

ใช้fputcsv()ในการเขียนและfgetcsv()อ่านซึ่งจะดูแลทั้งหมด


3
ความคิดเห็นนี้ในหน้าเอกสารประกอบของfputcsv()แสดงวิธีที่คุณสามารถใช้fputcsv()เมื่อคุณต้องการส่งออกในรูปแบบ csv ไปยังเบราว์เซอร์แทนไฟล์จริง
dennisschagt

15
@Angelin Nadar คุณช่วยเพิ่มแหล่งที่มาให้กับการเรียกร้องของคุณเกี่ยวกับความจำเป็นที่จะต้องเพิ่มเครื่องหมายคำพูดเดี่ยวสองครั้ง, แบ็กสแลชและ NUL หรือไม่? ฉันไม่ได้พบมันในRFC-4180
Petr 'PePa' Pavel

2
คุณไม่จำเป็นต้องหลบหนีคำพูดเดียว ฯลฯ ไฟล์ CSV ที่ถูกต้องไม่จำเป็นต้องเพิ่มเครื่องหมายคำพูดคู่รอบ ๆ ฟิลด์ซึ่งมีเพียงคำพูดเดียว หากใช้เครื่องอ่าน CSV อย่างถูกต้องควรอ่านไฟล์อย่างถูกต้องแม้จะมีสัญลักษณ์เหล่านั้น
xji

4
ทำไมคำตอบนี้ถึงได้โหวต? ความคิดเห็นเกี่ยวกับการหลีกเลี่ยงอักขระไม่เคยถูกสำรองและคำถามดั้งเดิมไม่ได้ถามเกี่ยวกับ PHP สิ่งนี้ดูเหมือนจะเป็นจริงสำหรับตัวคั่นสตริง (และเฉพาะสำหรับตัวคั่นที่เลือก) เมื่อโปรแกรมเช่น Open Office อนุญาตให้คุณเปลี่ยนได้
Dave F

0

ฉันรู้ว่านี่เป็นโพสต์เก่า แต่นี่คือวิธีที่ฉันแก้ไขมัน (พร้อมกับการแปลงค่า Null เป็นสตริงว่าง) ใน C # โดยใช้วิธีการขยาย

สร้างคลาสสแตติกที่มีลักษณะดังนี้:

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

จากนั้นสำหรับแต่ละสตริงที่คุณเขียนถึง CSV แทนที่จะเป็น:

stringBuilder.Append( WhateverVariable );

คุณเพิ่งทำ:

stringBuilder.Append( WhateverVariable.Q() );

-1

หากค่ามีเครื่องหมายจุลภาคอักขระขึ้นบรรทัดใหม่หรืออัญประกาศคู่สตริงจะต้องอยู่ในเครื่องหมายคำพูดคู่ เช่น: "อักขระขึ้นบรรทัดใหม่ในฟิลด์นี้ \ n"

คุณสามารถใช้เครื่องมือออนไลน์ด้านล่างเพื่อหลีกเลี่ยง "" และตัวดำเนินการ https://www.freeformatter.com/csv-escape.html#ad-output

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.