แปลง CSV เป็น JSON และกลับไปกลับมาโดยไม่ทำให้ข้อมูลเสียหาย
CSV คือตารางข้อความธรรมดา โดยหนึ่งเรคคอร์ดต่อหนึ่งบรรทัด และแยกฟิลด์ด้วยตัวคั่น ซึ่งมักเป็นเครื่องหมายจุลภาค ข้อมูลจะพังเมื่อฟิลด์มีตัวคั่น เครื่องหมายคำพูดคู่ หรือการขึ้นบรรทัดใหม่ เพราะโปรแกรมอ่านต้องแยกให้ออกระหว่างโครงสร้างกับเนื้อหา ให้ทำตามกฎการใส่เครื่องหมายคำพูด ตรวจตัวคั่นและแถวหัวตาราง และเก็บตัวเลขที่มีเลขศูนย์นำหน้าไว้เป็นข้อความ บทความที่เหลือจะอธิบายว่าการแปลงไปกลับทำอะไรได้และทำอะไรไม่ได้บ้าง
แปลง CSV เป็น JSONต้องการแปลง CSV เป็น JSON หรือกลับกันใช้ฟรีไฟล์ CSV จริงๆ คืออะไร
CSV ไม่มีมาตรฐานเดียวที่เป็นทางการ แต่ RFC 4180 อธิบายรูปแบบที่ใช้กันทั่วไป และโปรแกรมอ่านส่วนใหญ่ทำตาม กฎหลักมีดังนี้
- แต่ละเรคคอร์ดอยู่ในบรรทัดของตัวเอง และ RFC ระบุว่าการขึ้นบรรทัดใหม่ใช้ carriage return และ line feed หรือ CRLF
- ฟิลด์คั่นด้วยเครื่องหมายจุลภาค
- ฟิลด์ที่มีเครื่องหมายจุลภาค เครื่องหมายคำพูดคู่ หรือการขึ้นบรรทัดใหม่ ต้องครอบด้วยเครื่องหมายคำพูดคู่
- เครื่องหมายคำพูดคู่ที่อยู่ในฟิลด์ที่ครอบอยู่ จะเขียนเป็นเครื่องหมายคำพูดคู่สองตัวติดกัน
ดังนั้นแถว 1001,"Smith, Ann",02134 มีสามฟิลด์ เพราะเครื่องหมายจุลภาคที่อยู่ในเครื่องหมายคำพูดเป็นเนื้อหา ตัวแยกที่ตัดทุกเครื่องหมายจุลภาคจะได้สี่ฟิลด์ ตัวอ่านของ fixmint ทำตามกฎเหล่านี้ ฟิลด์ที่ครอบอยู่สามารถมีตัวคั่น การขึ้นบรรทัดใหม่ และเครื่องหมายคำพูดซ้อนได้ และหากเครื่องหมายคำพูดไม่ปิด ระบบจะแจ้งบรรทัดที่เครื่องหมายนั้นเริ่มต้น
ทำไมตัวคั่นถึงเปลี่ยน
เครื่องหมายจุลภาคเป็นค่าตั้งต้นของ RFC แต่ในหลายประเทศเครื่องหมายจุลภาคใช้เป็นจุดทศนิยม เช่น 1,5 หมายถึงหนึ่งจุดห้า โปรแกรมสเปรดชีตจึงมักบันทึก CSV โดยใช้เซมิโคลอนแทน ไฟล์ที่คั่นด้วยแท็บ (TSV) หลีกเลี่ยงความขัดแย้งนี้ได้ในข้อมูลส่วนใหญ่ เพราะแท็บแทบไม่ปรากฏในข้อความ
เมนู Delimiter มีตัวเลือก Auto, Comma, Semicolon, Tab และ Pipe โหมด Auto จะอ่านสิบบรรทัดแรก นับตัวคั่นแต่ละตัวที่อยู่นอกเครื่องหมายคำพูด แล้วเลือกตัวที่จำนวนต่อบรรทัดสม่ำเสมอที่สุด หาก Auto เดาผิด ให้เลือกตัวคั่นเองได้
แปลงใน fixmint
ตัวอย่างต่อไปนี้ใช้ค่าตั้งต้นของ เครื่องมือแปลง CSV เป็น JSON
ตัวอย่างการทำงาน
วาง CSV นี้ และเลือกช่อง First row is a header ไว้:
id,name,zip,note
1001,"Smith, Ann",02134,"She said ""hi"""
1002,Bo,10001,"line one
line two"
เมื่อปิด Convert numbers และตั้ง JSON indent เป็น 2 spaces เครื่องมือจะได้ผลลัพธ์ดังนี้:
[
{
"id": "1001",
"name": "Smith, Ann",
"zip": "02134",
"note": "She said \"hi\""
},
{
"id": "1002",
"name": "Bo",
"zip": "10001",
"note": "line one\nline two"
}
]
เมื่อเปิด Convert numbers ค่า id และ zip ที่เป็น 10001 จะกลายเป็นตัวเลข ส่วน 02134 จะยังเป็นข้อความอยู่
ขั้นตอน
- วาง CSV หรือลากไฟล์ .csv, .tsv, .txt หรือ .json มาวาง
- ตรวจ First row is a header, Delimiter และ Convert numbers เลือก JSON indent เป็น 2 spaces, Tab หรือ Minified
- คัดลอกผลลัพธ์ หรือดาวน์โหลดเป็นไฟล์ .json
เก็บตัวเลขไว้เป็นข้อความ
ตัวเลข JSON ห้ามมีเลขศูนย์นำหน้า ดังนั้น 02134 จึงไม่ใช่ตัวเลข JSON ที่ถูกต้อง รหัสไปรษณีย์ หมายเลขโทรศัพท์ และรหัสสินค้าต้องคงเป็นข้อความ ไม่เช่นนั้นเลขศูนย์จะหายไป เมื่อเปิด Convert numbers เครื่องมือจะแปลง 10001 แต่เก็บ 02134 ไว้เป็นสตริง ตัวเลือกนี้ปิดอยู่เป็นค่าเริ่มต้น และจะแปลงเฉพาะค่าที่ใช้จุดเป็นจุดทศนิยมเท่านั้น ดังนั้น 1,5 ในไฟล์ที่ใช้เซมิโคลอนจะคงอยู่ตามที่พิมพ์
รหัสที่ยาวก็ต้องระวังเช่นกัน JavaScript ซึ่งทำงานกับ JSON ในเบราว์เซอร์ส่วนใหญ่ เก็บตัวเลขเป็นทศนิยมแบบจุดลอยตัว 64 บิต จำนวนเต็มจะแม่นยำเฉพาะถึง 9,007,199,254,740,991 ซึ่งเท่ากับสองยกกำลัง 53 ลบ 1 ตัวเลข 12345678901234567890 จะกลายเป็น 12345678901234567000 เมื่อโปรแกรม JavaScript อ่าน เครื่องมือเขียนตัวเลขตามที่พิมพ์ แต่โปรแกรมที่แยกวิเคราะห์ JSON ด้วย JavaScript จะปัดเศษให้ ดังนั้นควรเก็บ ID เป็นสตริง เครื่องมือจัดรูปแบบ JSON ก็เก็บตัวเลขเหล่านี้ตามที่พิมพ์เช่นกัน และจะแจ้งว่าเก็บไว้กี่ตัว
JSON ที่ซ้อนกันและการกลับไปเป็น CSV
CSV เป็นแบบแบน ส่วน JSON ซ้อนกันได้ เมื่อแปลง JSON เป็น CSV ระบบจะสร้างหนึ่งคอลัมน์สำหรับแต่ละคีย์ที่พบในทุกออบเจกต์ เรียงตามลำดับที่คีย์นั้นปรากฏครั้งแรก ออบเจกต์หรือลิสต์ที่ซ้อนอยู่จะถูกเขียนลงช่องเป็นข้อความ JSON ค่า null จะกลายเป็นช่องว่าง ส่วน true และ false จะเขียนเป็นคำ แถวต่างๆ คั่นด้วย CRLF และฟิลด์จะถูกครอบด้วยเครื่องหมายคำพูดเฉพาะเมื่อมีตัวคั่น เครื่องหมายคำพูด การขึ้นบรรทัดใหม่ หรือช่องว่างที่ปลายใดปลายหนึ่ง
อินพุตที่ขึ้นต้นด้วย [ หรือ { จะถูกอ่านเป็น JSON ปุ่มรูปชิปจะสลับทิศทาง โดยมีป้ายกำกับเป็น CSV → JSON หรือ JSON → CSV ในทิศทาง JSON → CSV ตัวเลือกผลลัพธ์จะมีเมนู Delimiter และตัวเลือก For Excel
การแปลงไปกลับทำให้ข้อมูลบางส่วนหายไป ค่า null และสตริงว่างจะกลายเป็นช่องว่างเหมือนกัน และโครงสร้างที่ซ้อนกันจะไม่กลับคืนมา ดังนั้นหากต้องการโครงสร้างเดิม ให้เก็บ JSON ต้นฉบับไว้
Excel, UTF-8 และ byte order mark
ไฟล์ CSV เป็นชุดของไบต์ และโปรแกรมอ่านต้องรู้การเข้ารหัส UTF-8 รองรับตัวอักษรที่มีเครื่องหมายกำกับและอักษรของภาษาอื่นได้ byte order mark ซึ่งเป็นสามไบต์ที่อยู่ต้นไฟล์ จะบอกว่าไฟล์นี้เป็น UTF-8 หากไม่มีมัน โปรแกรมสเปรดชีตบางตัวจะอ่านไฟล์ด้วยรหัสหน้าของเครื่อง และตัวอักษรที่มีเครื่องหมายกำกับจะกลายเป็นอักขระแปลกๆ นอกจากนี้ สเปรดชีตมักเปลี่ยน 02134 เป็น 2134 เมื่อเปิดไฟล์ CSV
ตัวเลือก For Excel จะเพิ่ม byte order mark ลงในไฟล์ CSV ที่ดาวน์โหลดเท่านั้น ไม่เพิ่มในข้อความที่คัดลอก และใช้ได้เฉพาะในทิศทาง JSON → CSV ตัวอ่านจะลบ byte order mark ออกจากอินพุต ดังนั้นไฟล์ที่มีอยู่แล้วจะแปลงได้โดยไม่เกิดข้อผิดพลาด
กรณีพิเศษ
- แถวที่ความยาวไม่เท่ากัน เมื่อเปิดหัวตาราง แถวที่สั้นกว่าจะถูกเติมด้วยค่าว่าง ส่วนแถวที่ยาวกว่าจะเก็บค่าส่วนเกินไว้เป็น column_N ผลลัพธ์จะแจ้งว่ามีกี่แถวที่ต่างจากหัวตาราง
- ชื่อหัวตารางซ้ำหรือว่าง ชื่อที่ซ้ำจะได้ _2, _3 ต่อท้ายไปเรื่อยๆ และชื่อที่ว่างจะกลายเป็น column_N การเปลี่ยนแปลงทั้งสองแบบนี้ช่วยไม่ให้คีย์สองตัวเขียนทับกัน
- เครื่องหมายคำพูดแบบโค้ง เครื่องหมายคำพูดอัจฉริยะจากโปรแกรมประมวลผลคำไม่ใช่เครื่องหมายคำพูดของ CSV ดังนั้นฟิลด์อย่าง “Smith, Ann” จะถูกแยกที่เครื่องหมายจุลภาค ให้เปลี่ยนเป็นเครื่องหมายตรงก่อน ด้วย แก้ข้อความที่วางมา หรือตามที่อธิบายใน คู่มือเครื่องหมายคำพูดแบบโค้ง
- การขึ้นบรรทัดใหม่ในเครื่องหมายคำพูด ฟิลด์ที่ยาวสองบรรทัดคือหนึ่งเรคคอร์ด แต่ ลบบรรทัดซ้ำ จะแบ่งข้อมูลนำเข้าทุกครั้งที่มีการขึ้นบรรทัดใหม่ จึงจะถือว่าสองส่วนนั้นเป็นแถวแยกกัน ให้แปลงเป็น JSON แล้วเปรียบเทียบออบเจกต์ หรือตรวจด้วยตนเอง เครื่องมือนี้ยังมีประโยชน์กับรายการที่มีหนึ่งค่าต่อหนึ่งบรรทัด
- ไฟล์ขนาดใหญ่ กล่องผลลัพธ์แสดงผลสูงสุด 100,000 อักขระแรก แต่ปุ่มคัดลอกและการดาวน์โหลดจะรวมผลลัพธ์ทั้งหมด
- JSON ที่ไม่ถูกต้อง ตัวแปลงจะแจ้งบรรทัดและคอลัมน์ของข้อผิดพลาด พร้อมเครื่องหมายชี้ใต้อักขระนั้น เครื่องมือจัดรูปแบบ JSON อธิบายข้อผิดพลาดที่พบบ่อย และ คู่มือข้อผิดพลาดของ JSON อธิบายรายละเอียดเพิ่มเติม
ช่องว่างที่เกินมารอบฟิลด์ แถวว่างกลางไฟล์ และเครื่องหมายคำพูดที่ใช้ไม่สม่ำเสมอ เป็นสาเหตุของปัญหา CSV ส่วนใหญ่ ก่อนที่ตัวคั่นจะมีผลด้วยซ้ำ ให้ ทำความสะอาด CSV ก่อน แล้วค่อยแปลง
แปลจาก ฉบับภาษาอังกฤษ ด้วยความช่วยเหลือของ AI
ความคิดเห็น
ยังไม่มีความคิดเห็น มาเป็นคนแรกกันเลย


