เหตุใดเครื่องหมายจุลภาคจึงเป็นตัวแยก / ตัวคั่นระเบียนที่ไม่ถูกต้องในไฟล์ CSV


32

ผมอ่านนี้บทความและฉันอยากรู้คำตอบที่เหมาะสมสำหรับคำถามนี้

สิ่งเดียวที่อยู่ในใจของฉันอาจเป็นได้ว่าในบางประเทศตัวแยกเลขทศนิยมเป็นเครื่องหมายจุลภาคและอาจมีปัญหาเมื่อแบ่งปันข้อมูลในCSVแต่ฉันไม่แน่ใจจริงๆในคำตอบของฉัน


6
ตัวคั่นใด ๆ เกือบจะดีกว่าเครื่องหมายจุลภาค เหตุผลก็คือเมื่อไฟล์ที่คั่นด้วยเครื่องหมายจุลภาคถูกอ่านในเครื่องมือการแยกวิเคราะห์ข้อมูลบางเครื่องหมายจุลภาคอาจสับสนกับเครื่องหมายวรรคตอนและขัดขวาง "เค้าโครง" ของเขตข้อมูลหรือคอลัมน์
Mike Hunter

33
คนถากถางเมื่อสังเกตว่าบทความนี้เป็นชิ้นส่วน SAS พัฟอาจแนะนำว่าบางที SAS มีปัญหาในการประมวลผลไฟล์ CSV ด้วยเครื่องหมายจุลภาค :-)
whuber

3
@whuber - SAS (จากประสบการณ์ของฉัน) สามารถต่อสู้กับไฟล์ CSV ไม่ว่าพวกเขาจะมีเครื่องหมายจุลภาคหรือไม่ต้องการการเข้ารหัสด้วยมือจำนวนมากสำหรับทุกสิ่งที่แปลก ๆ ที่ SAS ไม่ชอบ
Jeremy Miles

8
ท่อ pilcrows - มีความสิ้นหวังในการค้นหาตัวคั่นเคยปิดบังมากขึ้นเป็นหนาม - ที่แสดงให้เห็นเห็นพ้องกับและต่อไปนี้เป็นมาตรฐานที่เป็นจริงเท่านั้นวิธีที่ปลอดภัยสำหรับคนที่จะแลกเปลี่ยนข้อมูลในแฟ้มข้อความที่คั่น และมาตรฐานสากลจะต้องอนุญาตให้แสดงสตริงข้อความใด ๆ (เช่นเดียวกับ RFC4180) แทนที่จะใช้สมมติฐานที่ว่าบางคนไม่จำเป็นต้อง & สามารถนำไปใช้กับงานอื่นได้
Scortchi - Reinstate Monica

2
(a) ฉันได้นำเข้าไฟล์. csv สำเร็จบ่อยครั้ง (b) ฉันแนะนำให้ผู้ใช้ไม่ใช้. csv หากพวกเขามีเครื่องหมายจุลภาคอยู่ในข้อมูล สิ่งเหล่านี้ไม่ขัดแย้งกัน โชคไม่ดีที่ (b) ต้องการคำอธิบายในบางไตรมาส
Nick Cox

คำตอบ:


33

รูปแบบสเป CSV จะถูกกำหนดไว้ในRFC 4180 ข้อมูลจำเพาะนี้ถูกเผยแพร่เพราะ

ไม่มีข้อกำหนดอย่างเป็นทางการในการดำรงอยู่ซึ่งช่วยให้การตีความที่หลากหลายของไฟล์ CSV

น่าเสียดายที่ตั้งแต่ปี 2005 (วันที่เผยแพร่ RFC) ไม่มีอะไรเปลี่ยนแปลง เรายังคงมีการใช้งานที่หลากหลาย วิธีการทั่วไปที่กำหนดไว้ใน RFC 4180 คือการใส่ฟิลด์ที่มีอักขระเช่นเครื่องหมายจุลภาคในเครื่องหมายคำพูดคำแนะนำนี้จะไม่ตรงกับซอฟต์แวร์ที่แตกต่างกัน

ปัญหาคือว่าในยุโรปต่าง ๆ ของตัวละครสถานที่จุลภาคทำหน้าที่เป็นจุดทศนิยมเพื่อให้คุณเขียนแทน0,005 0.005แต่ในกรณีอื่น ๆ จะใช้เครื่องหมายจุลภาคแทนช่องว่างเพื่อส่งสัญญาณกลุ่มหลักเช่น4,000,000.00(ดูที่นี่ ) ในทั้งสองกรณีการใช้เครื่องหมายจุลภาคอาจนำไปสู่ข้อผิดพลาดในการอ่านข้อมูลจากไฟล์ csv เนื่องจากซอฟต์แวร์ของคุณไม่ทราบว่า0,005, 0,1เป็นตัวเลขสองตัวหรือสี่ตัวเลข (ดูตัวอย่างที่นี่ )

สุดท้าย แต่ไม่ท้ายสุดถ้าคุณเก็บข้อความไว้ในไฟล์ข้อมูลคอมมาจะเป็นข้อความธรรมดามากกว่าเซมิโคลอนดังนั้นหากข้อความของคุณไม่อยู่ในเครื่องหมายอัญประกาศข้อมูลดังกล่าวสามารถอ่านได้ง่ายพร้อมข้อผิดพลาด .

ไม่มีอะไรที่ทำให้เครื่องหมายจุลภาคดีขึ้นหรือแบ่งฟิลด์แย่ลงเท่าที่ใช้ไฟล์ CSV ตามคำแนะนำเช่น RFC 4180 ที่ป้องกันปัญหาที่อธิบายไว้ข้างต้น อย่างไรก็ตามหากมีความเสี่ยงในการใช้รูปแบบ CSV แบบง่าย ๆ ที่ไม่ได้ใส่เขตข้อมูลไว้ในเครื่องหมายคำพูดหรืออาจใช้การแนะนำแบบไม่ต่อเนื่องตัวคั่นอื่น ๆ (เช่นอัฒภาค) ดูเหมือนจะปลอดภัยกว่า


6
ซอฟต์แวร์ที่ใช้มาตรฐาน CSV จริงตามที่กำหนดโดย RFC 4180 จะรู้ได้อย่างแน่นอนว่าจะตีความสตริงที่กำหนดอย่างไร อาร์กิวเมนต์ที่ใช้,แทนตัวคั่น rarer จะบวมข้อมูลเนื่องจากคุณต้องหลีกเลี่ยงมันตลอดเวลาว่าเป็นจริง เห็นได้ชัดว่ามีคนเหล่านั้นที่คิดว่าพวกเขารู้ว่า CSV ทำงานอย่างไร แต่ไม่จริง
Voo

2
@ Voo ใช่ แต่เนื่องจากมีการใช้ไฟล์ "csv" ในลักษณะที่ยุ่งเหยิงจึงปลอดภัยกว่าที่จะไม่ใช้เครื่องหมายจุลภาคและแทนที่จะใช้เครื่องหมายจุลภาคอื่นแทนเช่นเครื่องหมายอัฒภาค นี่คือคำตอบสำหรับคำถาม OP ไม่มีอะไร "ดีกว่า" ในอัฒภาค (หรือเครื่องหมายจุลภาคอื่น ๆ ) เมื่อเทียบกับเครื่องหมายจุลภาคพวกเขาเป็นเพียงทางเลือกที่ปลอดภัยกว่าในหลายกรณี
ทิม

2
@Voo +1 ความคิดเห็นของคุณ อย่างไรก็ตามทุกคนที่ใช้ CSV ไม่สนใจไฟล์ข้อมูลป่องจริง ๆ !
whuber

17

ในทางเทคนิคเครื่องหมายจุลภาคนั้นดีพอ ๆ กับอักขระอื่น ๆ ที่จะใช้เป็นตัวคั่น ชื่อของรูปแบบหมายถึงค่าที่คั่นด้วยเครื่องหมายจุลภาคโดยตรง (ค่าที่คั่นด้วยเครื่องหมายจุลภาค)

คำอธิบายของรูปแบบ CSVใช้เครื่องหมายจุลภาคเป็นตัวคั่น

ฟิลด์ใด ๆ ที่มีเครื่องหมายจุลภาคควรเป็นเครื่องหมายคำพูดคู่ ดังนั้นจึงไม่ทำให้เกิดปัญหาในการอ่านข้อมูลดูจุดที่ 6 จากคำอธิบาย :

  1. ฟิลด์ที่มีตัวแบ่งบรรทัด (CRLF) เครื่องหมายคำพูดคู่และเครื่องหมายจุลภาคควรอยู่ในเครื่องหมายคำพูดคู่

ตัวอย่างเช่นฟังก์ชั่นread.csvและwrite.csvจาก R โดยค่าเริ่มต้นจะใช้เครื่องหมายจุลภาคเป็นตัวคั่น


4
นี่คือคำตอบที่ดีที่สุดเพราะมันหมายถึงvaluesว่าคั่นด้วยเครื่องหมายจุลภาค คนอื่นพูดถึงformattingตัวเลขของยุโรปนี่ไม่ใช่ปัญหาสำหรับ csv standardเนื่องจากคุณอ้างจุด 6 อย่างถูกต้อง ความแตกต่างจาก "การใช้งานที่ถูกต้อง" มีอยู่ในรูปแบบข้อมูลใด ๆ ประเด็นคือ - รู้ข้อมูลของคุณ คนอื่นพูดถึงtabหรือ;คั่น แต่สิ่งเหล่านี้อาจมีปัญหาเหมือนกับเครื่องหมายจุลภาคเมื่อคุณจัดการกับข้อมูลที่ป้อนโดยผู้ใช้ (อาจผ่านฟอร์มและบันทึกโดยฐานข้อมูล - ฉันต้องทะเลาะกับช่องป้อนข้อความฟรีที่ผู้คน มีนิ้วมืออ้วนtab... มันแย่มาก)
Adrian Torrie

คำตอบของ Tim ได้รับการแก้ไขแล้วเพื่อรวมข้อมูล @djhurio ที่ให้ไว้
Adrian Torrie

11

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


2
(+1) มาตรฐานให้การใช้เครื่องหมายคำพูดคู่เป็นส่วนหนึ่งของข้อมูลโดยยืนยันในการเพิ่มเป็นสองเท่าอีกครั้ง: "Belloc", "Tarantella", "" "หมัดที่ล้อเลียนใน High Pyrenees" " ในอังกฤษไม่ใช่เรื่องแปลกที่จะหาช่องที่อยู่ซึ่งมีชื่อของบ้านในเครื่องหมายคำพูดดังนั้น: "Chatsworth", Melton Road, Leamington (มันไม่ชัดเจนว่าทำไม: พรานล่าสัตว์บ่นว่า "ความหมายที่ดูเหมือนจะเป็น: อาศัยอยู่ในบ้านที่คนฉลาดเรียกว่า '164 Melton Road' แต่คนโง่คนหนึ่งชอบเรียก 'Chatsworth'")
Scortchi - Reinstate Monica

1
@ Scortchi ดูเหมือนว่าเราเรียนรู้บทกวีเดียวกันตอนอายุ 12 (+/- ข้อผิดพลาด) ฉันกลัวว่าสิ่งที่ฉันอ่านในช่วงต้นศตวรรษที่ 20 ผู้เคราะห์ร้ายหัวสูงชาวอังกฤษผู้เคราะห์ร้ายหัวสูงสำหรับนิสัยของคนชั้นกลางที่ปิดบังตัวอย่างสุดท้ายของคุณซึ่งจะไม่โปร่งใสเกินกว่ากลุ่มเล็ก ๆ
Nick Cox

@NickCox: สิบสองฟังดูถูกต้อง ตลกดีที่ฉันจำไม่ได้ว่าฉันอ่านบทกวีปีนี้หรือไม่อย่าลืมนึกถึงบทใด ๆ จากพวกเขา แม้ว่าจุดประสงค์ของพรานล่าสัตว์นั้นเกี่ยวกับผลกระทบต่อผู้อ่านเครื่องหมายอัญประกาศที่ไม่จำเป็น (โปรดดูquickquotes.com ) แต่ฉันคิดว่าคุณถูกต้องที่จะเห็นอิทธิพลของความหัวสูงในการเลือกตัวอย่างของเขา ฉันหวังว่าจุดเล็ก ๆ น้อย ๆ ที่เป็นสิ่งที่ควรระวังหากคุณเคยส่งไฟล์ CSV ที่มีที่อยู่เป็นภาษาอังกฤษนั้นชัดเจนสำหรับทุกคนแม้จะมีการแยกย่อยของฉัน
Scortchi - Reinstate Monica

1
ในอินเดียมันเป็นเรื่องธรรมดาสำหรับคนที่สร้างบ้านหลังแรกของพวกเขา (ไม่ใช่อพาร์ทเมนท์) เพื่อให้ชื่อดอกไม้ที่เป็นนวัตกรรมใหม่มักจะเป็นภาษาพื้นถิ่นหรือวลีภาษาสันสกฤตและพวกเขาอยู่ในเครื่องหมายคำพูดคู่เช่น "Guru Kripa" ชื่ออย่าง Genelia D'Souza และ Derek O'Brien ก็เหมือนกัน จากนั้นที่อยู่ที่บอกว่า "Old Door No. nnn / New Door No. mm / c" เนื่องจากการกำหนดหมายเลขรัฐบาลใหม่ทำให้การจัดเก็บที่อยู่มีความซับซ้อนยิ่งขึ้นอีกเนื่องจากมีเครื่องหมายทับและคำพูดเดี่ยวในมุมที่ไม่คาดคิด
วนใจ

@WirlMind: น่าสนใจ - ฉันสังเกตเห็นมาก - ดีกว่าที่ฉันคาดไว้ - ชื่อบ้านในภาษาเกลิคและเวลส์ในอังกฤษซึ่งอาจเทียบเท่ากับการเลือกภาษาท้องถิ่นที่ใกล้เคียงที่สุด
Scortchi - Reinstate Monica

9

ในขณะที่คำตอบของ @Tim นั้นถูกต้อง - ฉันต้องการเพิ่มว่า "csv" โดยรวมไม่มีมาตรฐานทั่วไป - โดยเฉพาะอย่างยิ่งกฎการหลบหลีกไม่ได้กำหนดไว้เลยนำไปสู่ ​​"รูปแบบ" ซึ่งสามารถอ่านได้ในโปรแกรมเดียว . นี่คือความจริงที่ว่า "โปรแกรมเมอร์" ทุกคนภายใต้ดวงอาทิตย์แค่คิดว่า "oooh csv- ฉันจะสร้างโปรแกรมแยกวิเคราะห์ของตัวเอง!" แล้วคิดถึงกรณีขอบทั้งหมด

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


5
ใช่มีเครื่องมือมาตรฐาน . ietf.org/html/rfc4180และรูปแบบอื่น ๆ ไม่ได้จัดเก็บข้อมูลเมตาใด ๆ มันไม่ได้ออกแบบมาสำหรับการจัดเก็บข้อมูลเมตา - ไฟล์. txt ยังไม่เก็บข้อมูลเมตาเกี่ยวกับเอกสารข้อความ ...
ทิม

4
ทิมมาตรฐานนั้นถูกเพิกเฉยบ่อยกว่าไม่ทำให้มันไม่เป็นมาตรฐาน ,,,
Christian Sauer

8
สิ่งที่ดีเกี่ยวกับมาตรฐานคือมีให้เลือกมากมาย (การกลายพันธุ์และการแสดงต่าง ๆ นานา)
Nick Cox

4

หากคุณสามารถกำหนดตัวคั่นจุลภาคและใช้อักขระแท็บคุณจะประสบความสำเร็จได้ดีกว่ามาก คุณสามารถปล่อยให้ไฟล์ชื่อ. CSV และการนำเข้าสู่โปรแกรมส่วนใหญ่มักจะไม่มีปัญหา เพียงระบุตัวคั่น TAB แทนเครื่องหมายจุลภาคเมื่อคุณนำเข้าไฟล์ของคุณ หากมีเครื่องหมายจุลภาคในข้อมูลของคุณคุณจะมีปัญหาเมื่อระบุเครื่องหมายจุลภาคคั่นตามที่คุณทราบดี


5
หากมีแท็บในข้อมูลของคุณการสนทนาจะมีผล อย่างน้อยก็ในประสบการณ์ของฉันมีโอกาสน้อยกว่า
Nick Cox

@ Nick และ Gorilla: ฉันได้ผลลัพธ์ที่ดีโดย|เป็นตัวคั่นในไฟล์ข้อความเหมือน csv ที่ทำเองที่บ้านของระเบียน (ที่มีชื่อหนังสือและข้อมูลเมตาของเอกสารอื่น ๆ ) |ไม่เคยเกิดขึ้นในข้อมูลที่ฉันทำงานด้วยดังนั้นฉันสามารถเขียนสคริปต์ Perl ที่แยก / เข้าร่วมได้โดยไม่ต้องตรวจสอบว่ามีข้อความใด ๆ นี่เป็นเพียงโครงการเดียวที่เกี่ยวข้องกับการประมวลผลข้อมูลเมตาที่บันทึกไว้จากฐานข้อมูล MS Access สำหรับโครงการขนาดใหญ่ใด ๆ หรือถ้าคุณวางแผนที่จะเก็บข้อมูลในรูปแบบไฟล์นี้ในระยะยาวเลือกสิ่งที่แข็งแกร่งกว่า! ฉันสามารถปรับแต่งบางสิ่งบางอย่างได้ถ้าชุดของเดือนนี้หักอะไร
Peter Cordes

@ PeterCordes ฉันเชื่อว่าคุณและสิ่งที่ทำงาน แต่ชัดเจนว่าค่าใช้จ่ายของตัวแยกที่เป็นนิสัยอาจจำเป็นต้องอธิบายสิ่งเหล่านั้นให้ผู้อื่นทราบและเป็นกุญแจสำคัญที่พวกเขาสามารถนำเข้าไฟล์ข้อมูลดังกล่าวได้โดยไม่ยาก ต้องเผชิญกับรูปแบบไฟล์ที่ผิดปกติมีความจำเป็นต้องมีการเข้าถึงประจำฟังก์ชั่นหรือคำสั่งที่สามารถแยกสตริงในตัวคั่นโดยพลการ
นิคค็อกซ์

@PeterCordes เมื่อฉันเขียนsplitคำสั่งสำหรับ Stata ฉันมองไปที่เหนือสิ่งอื่นใดเทียบเท่า Perl เพื่อดูสิ่งที่มันทำและไม่ได้ทำ ไม่ใช่ซอร์สโค้ด แต่มีเพียงฟังก์ชันการทำงานที่มีให้
นิคค็อกซ์

1
@NickCox: ฟังก์ชั่นมากมายของ Perl ได้รับการออกแบบมาค่อนข้างดี IMO พวกเขาทำงานให้เสร็จโดยไม่มีข้อ จำกัด พิเศษมากมายเช่นคุณพบใน awk (ซึ่งมักจะดี) หรือโดยเฉพาะอย่างยิ่ง เครื่องมือ Unix อื่น ๆ เช่นcut, และsort uniq
Peter Cordes

4

ASCII มอบอักขระ "ตัวคั่น" สี่ตัวตามที่แสดงด้านล่างในตัวอย่างจากหน้า ascii (7) * ระวังตัว:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

คำตอบนี้ให้ภาพรวมที่ดีของการใช้งาน

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


2
น่าสนใจ ฉันไม่คิดว่าฉันเคยเห็นเหล่านี้มาใช้ในการแม้ว่าป่า ...
แมตต์กรอส

4

ปัญหาไม่ใช่เครื่องหมายจุลภาค ปัญหาคือการอ้างถึง ไม่ว่าคุณจะใช้ตัวคั่นระเบียนและเขตข้อมูลใดคุณจะต้องเตรียมพร้อมสำหรับการพบกันในเนื้อหา ดังนั้นคุณต้องมีกลไกข้อความ และจากนั้นคุณต้องมีวิธีสำหรับอักขระที่อ้างถึงเพื่อให้ปรากฏเช่นกัน

การปฏิบัติตามมาตรฐาน RFC 4180 ทำให้ทุกอย่างง่ายขึ้นสำหรับทุกคน

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

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