ฉันจะหลีกเลี่ยงเครื่องหมายจุลภาคและเครื่องหมายคำพูดในไฟล์ CSV เพื่อให้ทำงานใน Excel ได้อย่างไร


111

ฉันกำลังสร้างไฟล์ CSV (คั่นด้วยจุลภาคแทนที่จะเป็นแท็บ) ผู้ใช้ของฉันมักจะเปิดไฟล์ CSV ใน Excel โดยดับเบิลคลิกที่ไฟล์นั้น ข้อมูลของฉันอาจมีลูกน้ำและเครื่องหมายคำพูดดังนั้นฉันจึงหลีกเลี่ยงสิ่งเหล่านี้ดังนี้

Reference, Title, Description
1, "My little title", "My description, which may contain ""speech marks"" and commas."
2, "My other little title", "My other description, which may also contain ""speech marks"" and commas."

เท่าที่ฉันรู้นั่นเป็นวิธีที่ต้องทำเสมอ นี่คือความเข้าใจผิดของฉัน: เมื่อฉันเปิดไฟล์นี้ใน Excel 2010 การหลบหนีของฉันไม่ได้รับการยอมรับ เครื่องหมายคำพูดปรากฏบนแผ่นงานและลูกน้ำจะทำให้เกิดคอลัมน์ใหม่

คำตอบ:


219

ในที่สุดเราก็พบคำตอบสำหรับเรื่องนี้

Excel จะเคารพการหลีกเลี่ยงของเครื่องหมายจุลภาคและเครื่องหมายคำพูดเท่านั้นหากค่าคอลัมน์ไม่ได้นำหน้าด้วยช่องว่าง ดังนั้นการสร้างไฟล์โดยไม่มีช่องว่างเช่นนี้ ...

Reference,Title,Description
1,"My little title","My description, which may contain ""speech marks"" and commas."
2,"My other little title","My other description, which may also contain ""speech marks"" and commas."

... แก้ไขปัญหา หวังว่านี่จะช่วยใครสักคน!


2
นี่เป็นปัญหาที่ฉันเคยพบมาก่อนและฉันมักจะลืมมันไป Excel ควรยุติการทำงานนี้เนื่องจากเป็นการสร้างความสับสนและไม่ใช่กฎที่เป็นประโยชน์ในตอนแรก นั่นหรือ csv ควรมีช่องว่างที่บังคับไม่ให้อยู่ระหว่างเครื่องหมายจุลภาค
Jacques Mathieu

61

ด้านล่างนี้เป็นกฎหากคุณเชื่อว่าเป็นแบบสุ่ม ฟังก์ชันยูทิลิตี้สามารถสร้างขึ้นได้จากกฎเหล่านี้

  1. หากค่ามีเครื่องหมายจุลภาคขึ้นบรรทัดใหม่หรือเครื่องหมายคำพูดคู่ควรส่งคืนค่า String ที่อยู่ในเครื่องหมายคำพูดคู่

  2. อักขระอัญประกาศคู่ใด ๆ ในค่าควรหลีกเลี่ยงด้วยเครื่องหมายคำพูดคู่อื่น

  3. หากค่าไม่มีเครื่องหมายจุลภาคขึ้นบรรทัดใหม่หรือเครื่องหมายอัญประกาศคู่ค่า String ควรส่งคืนโดยไม่เปลี่ยนแปลง


4
การอ้าง - ตัดสิ่งที่ไม่มีเครื่องหมายจุลภาคเครื่องหมายอัญประกาศคู่หรือขึ้นบรรทัดใหม่เป็นเรื่องเสียหายหรือไม่
Erik Reppen

2
ไม่ ErikReppen ฉันไม่คิดว่าจะเจ็บเป็นปกติ ฉันเป็นของพื้นหลัง java ซึ่งไม่แนะนำให้สร้างสตริงใหม่โดยแทนที่ข้อความในอันเก่าเนื่องจากมีส่วนแบ่งของตัวเองในหน่วยความจำฮีป หากคุณต้องการคุณสามารถแทนที่ค่าทั้งหมดโดยไม่มีเงื่อนไขและแจ้งให้เราทราบว่ามันทำให้เกิดปัญหาใด ๆ แม้ว่าจะไม่ควรก็ตาม
AlphaBetaGamma

2
ช่องที่ขึ้นต้นหรือลงท้ายด้วยช่องว่างควรถูกยกมา
Jonathan Rosenne

2

ตามคำแนะนำของ Yashu ฉันเขียนฟังก์ชันต่อไปนี้ (เป็นรหัส PL / SQL แต่ควรปรับให้เข้ากับภาษาอื่นได้ง่าย)

FUNCTION field(str IN VARCHAR2) RETURN VARCHAR2 IS
    C_NEWLINE CONSTANT CHAR(1) := '
'; -- newline is intentional

    v_aux VARCHAR2(32000);
    v_has_double_quotes BOOLEAN;
    v_has_comma BOOLEAN;
    v_has_newline BOOLEAN;
BEGIN
    v_has_double_quotes := instr(str, '"') > 0;
    v_has_comma := instr(str,',') > 0;
    v_has_newline := instr(str, C_NEWLINE) > 0;

    IF v_has_double_quotes OR v_has_comma OR v_has_newline THEN
        IF v_has_double_quotes THEN
            v_aux := replace(str,'"','""');
        ELSE
            v_aux := str;
        END IF;
        return '"'||v_aux||'"';
    ELSE
        return str;
    END IF;
END;

0

คำพูดเดี่ยวก็ใช้ได้ดีเช่นกันแม้ว่าจะไม่หนีเครื่องหมายคำพูดคู่อย่างน้อยก็ใน Excel 2016:

'text with spaces, and a comma','more text with spaces','spaces and "quoted text" and more spaces','nospaces','NOSPACES1234'

Excel จะใส่ไว้ใน 5 คอลัมน์ (หากคุณเลือกเครื่องหมายคำพูดเดียวเป็น "Text qualifier" ในวิซาร์ด "Text to Column")


-3

แม้จะมีเครื่องหมายอัญประกาศคู่ฉันก็มีปัญหานี้มาสองสามวันแล้ว

แทนที่ตัวคั่นท่อด้วยเครื่องหมายจุลภาคจากนั้นสิ่งต่างๆก็ทำงานได้ดี


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