CSV Import Pitfalls
CSV ดูง่าย แต่พังง่ายกว่า
Section titled “CSV ดูง่าย แต่พังง่ายกว่า”CSV (Comma-Separated Values) เป็น Format ที่ใช้แลกเปลี่ยนข้อมูลมากที่สุด แต่เต็มไปด้วยกับดักที่ทำให้ข้อมูลเพี้ยนตั้งแต่ตอน Import
ปัญหาที่ 1: Leading Zeros หายไป
Section titled “ปัญหาที่ 1: Leading Zeros หายไป”รหัสไปรษณีย์ 01000 หรือเลขบัตรประชาชน 0812345678 — พอ Import เข้า Sheets จะกลายเป็น 1000 และ 812345678
วิธีแก้
Section titled “วิธีแก้”- Import แบบ Plain Text — เปิดไฟล์ > Import > แยก type เป็น Text สำหรับคอลัมน์นั้น
- ใส่ Apostrophe นำหน้า — พิมพ์
'01000จะเก็บเป็น Text - ใช้สูตร TEXT() —
=TEXT(A1, "00000")เพื่อเติม Leading Zero กลับ
=TEXT(1000, "00000") → "01000"=TEXT(812345678, "0000000000") → "0812345678"#include <stdio.h>#include <string.h>// อ่าน CSV ต้องเก็บเป็น string ไม่ใช่ intint main() { char zipcode[] = "01000"; printf("ZIP: %s\n", zipcode); // เก็บเป็น string → ไม่หาย return 0;}import pandas as pd# บังคับให้คอลัมน์เป็น string ตอนอ่านdf = pd.read_csv("data.csv", dtype={"zipcode": str, "phone": str})print(df["zipcode"].head()) # 01000 ยังอยู่-- เก็บรหัสไปรษณีย์เป็น VARCHAR ไม่ใช่ INTCREATE TABLE addresses ( zipcode VARCHAR(5), -- ไม่ใช่ INT! phone VARCHAR(10));ปัญหาที่ 2: วันที่ถูกตีความผิด
Section titled “ปัญหาที่ 2: วันที่ถูกตีความผิด”01/02/2025 คือ 1 กุมภาพันธ์ หรือ 2 มกราคม? ขึ้นอยู่กับ Locale ของ Spreadsheet
| Locale | ตีความ 01/02/2025 เป็น |
|---|---|
| US (MM/DD/YYYY) | 2 มกราคม |
| Thai/EU (DD/MM/YYYY) | 1 กุมภาพันธ์ |
วิธีแก้
Section titled “วิธีแก้”- ตรวจสอบ Locale: File > Settings > Locale
- ใช้ Format ISO 8601 ใน CSV:
2025-02-01(ไม่ ambiguous) - Import แล้วตรวจสอบวันที่ตัวอย่างทันที
#include <stdio.h>#include <time.h>// ISO 8601 format ชัดเจนที่สุดint main() { struct tm t = {0}; strptime("2025-02-01", "%Y-%m-%d", &t); printf("Month: %d, Day: %d\n", t.tm_mon+1, t.tm_mday); return 0;}import pandas as pd# ระบุ format ตอนอ่านเพื่อไม่ให้ตีความผิดdf = pd.read_csv("data.csv", parse_dates=["date"], dayfirst=True) # DD/MM/YYYY-- ใช้ STR_TO_DATE() ระบุ format ชัดเจนSELECT STR_TO_DATE('01/02/2025', '%d/%m/%Y') AS parsed_date;ปัญหาที่ 3: Encoding ภาษาไทย
Section titled “ปัญหาที่ 3: Encoding ภาษาไทย”ไฟล์ CSV ภาษาไทยอาจใช้ Encoding ต่างกัน:
| Encoding | ใช้โดย | ปัญหา |
|---|---|---|
| UTF-8 | มาตรฐานสมัยใหม่ | ไม่มี ถ้าไฟล์เป็น UTF-8 จริง |
| TIS-620 / Windows-874 | ระบบราชการไทย, โปรแกรมเก่า | ภาษาไทยเป็นอักษรแปลก ๆ |
วิธีแก้
Section titled “วิธีแก้”- เปิดไฟล์ใน Text Editor (เช่น VS Code) ก่อน → ดู Encoding ที่มุมขวาล่าง
- ถ้าเป็น TIS-620 → Save As UTF-8 ก่อน Import
- ใน Google Sheets: File > Import > Upload > เลือก “Detect automatically”
// ใน C ต้องจัดการ encoding ด้วย iconv library// iconv -f TIS-620 -t UTF-8 input.csv > output.csv# อ่านไฟล์ TIS-620df = pd.read_csv("data.csv", encoding="tis-620")# แล้ว save เป็น UTF-8df.to_csv("data_utf8.csv", encoding="utf-8", index=False)-- ตั้ง character set ตอน LOAD DATALOAD DATA INFILE 'data.csv'INTO TABLE my_tableCHARACTER SET tis620FIELDS TERMINATED BY ',';| ปัญหา | สาเหตุ | วิธีแก้ |
|---|---|---|
| Leading Zeros หาย | Auto type detection | Import เป็น Text / ใช้ TEXT() |
| วันที่ผิด | Locale ต่างกัน | ใช้ ISO 8601 / ตรวจ Locale |
| ภาษาไทยเพี้ยน | Encoding ไม่ตรง | แปลงเป็น UTF-8 ก่อน Import |