JSON และ CSV แบบสตรีม
json.Decoder และ encoding/csv สำหรับข้อมูลขนาดใหญ่
JSON และ CSV แบบสตรีม เป็นบทเรียน Go Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Go Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุใดจึงใช้สตรีม
การโหลดไฟล์ JSON หรือ CSV ขนาดใหญ่ทั้งหมดลงในหน่วยความจำทำให้ใช้ฮีปสูง การประมวลผลแบบสตรีมจะประมวลผลเรกคอร์ดทีละรายการ ทำให้การใช้หน่วยความจำคงที่โดยไม่ขึ้นกับขนาดไฟล์
json.Decoder สำหรับการประมวลผลแบบสตรีม
json.NewDecoder ห่อ io.Reader ใด ๆ ใช้ Token() เพื่อไล่ดูสตรีมโทเค็น JSON หรือใช้ Decode ภายในวนรอบสำหรับอาร์เรย์ JSON
dec := json.NewDecoder(file)
// consume opening [
for dec.More() {
var record Record
dec.Decode(&record)
process(record)
}การตรวจจับจุดเริ่มต้นของอาร์เรย์
เรียก dec.Token() เพื่ออ่านวงเล็บเปิดก่อนวนรอบการถอดรหัส:
t, _ := dec.Token() // consume [
for dec.More() {
var r Record
dec.Decode(&r)
}การประมวลผลแบบสตรีมจาก HTTP
ถอดรหัส JSON โดยตรงจากเนื้อหาการตอบกลับ HTTP โดยไม่ต้องบัฟเฟอร์การตอบกลับทั้งหมด:
resp, _ := http.Get(url)
defer resp.Body.Close()
dec := json.NewDecoder(resp.Body)
for dec.More() {
var item Item
dec.Decode(&item)
process(item)
}ตัวอ่าน encoding/csv
csv.NewReader อ่าน CSV ทีละแถว ตั้งค่า LazyQuotes, TrimLeadingSpace และ Comment เพื่อจัดการรูปแบบ CSV ที่พบในโลกจริง
r := csv.NewReader(file)
for {
record, err := r.Read()
if err == io.EOF { break }
if err != nil { return err }
process(record)
}การข้ามส่วนหัว CSV
อ่านและทิ้งเรกคอร์ดแรกเพื่อข้ามแถวส่วนหัว:
r.Read() // discard header
for {
record, err := r.Read()
if err == io.EOF { break }
}csv.Writer
เขียน CSV ทีละแถวด้วย csv.NewWriter เรียก w.Flush() เสมอ และตรวจสอบ w.Error() หลังเขียน
w := csv.NewWriter(file)
w.Write([]string{"name", "age"})
w.Flush()
if err := w.Error(); err != nil { return err }ตัวคั่นแบบกำหนดเอง
ไฟล์ CSV บางครั้งใช้เครื่องหมายอัฒภาคหรือแท็บ ให้ตั้งค่า r.Comma เป็นรูนที่ต้องการ
r := csv.NewReader(file)
r.Comma = ';' // semicolon-separatedการประมวลผลบรรทัด JSON แบบสตรีม (NDJSON)
JSON แบบคั่นด้วยขึ้นบรรทัดใหม่ (ออบเจ็กต์ JSON หนึ่งรายการต่อบรรทัด) เหมาะสำหรับการประมวลผลแบบสตรีม เพียงอ่านทีละบรรทัดแล้วถอดรหัสแต่ละบรรทัดแยกจากกัน
scanner := bufio.NewScanner(file)
for scanner.Scan() {
var record Record
json.Unmarshal(scanner.Bytes(), &record)
}การใช้หน่วยความจำขณะสตรีมข้อมูล
การสตรีมข้อมูลทำให้การจองหน่วยความจำบนฮีปคงอยู่ที่ O(ขนาดระเบียน) แทนที่จะเป็น O(ขนาดไฟล์) สำหรับไฟล์ขนาด 1 GB ที่มีระเบียนขนาด 1 KB การสตรีมข้อมูลจะใช้หน่วยความจำประมาณ 1 KB เทียบกับประมาณ 1 GB เมื่อโหลดข้อมูลทั้งหมดไว้ในหน่วยความจำ
การยกเลิก Context ระหว่างสตรีมข้อมูล
ตรวจสอบ ctx.Done() ภายในลูปถอดรหัส เพื่อยกเลิกการสตรีมข้อมูลเมื่อ Context ถูกยกเลิก และป้องกันไม่ให้โกโรทีนอ่านข้อมูลต่อจนถึง EOF
for dec.More() {
select {
case <-ctx.Done():
return ctx.Err()
default:
}
dec.Decode(&record)
}ตรวจสอบความเข้าใจ
ข้อดีของการสตรีม JSON ด้วย json.Decoder เมื่อเทียบกับ json.Unmarshal คืออะไร
ทบทวน: การสตรีม JSON และ CSV
ประเด็นสำคัญ:
- json.Decoder: ใช้ลูปกับ dec.More() สำหรับอาร์เรย์ JSON
- csv.NewReader: อ่านทีละแถว และกำหนด Comma เมื่อต้องการตัวคั่นแบบกำหนดเอง
- NDJSON: ใช้ bufio.Scanner ร่วมกับ Unmarshal ทีละบรรทัด
- การสตรีมข้อมูลทำให้การใช้หน่วยความจำคงที่ ไม่ว่าไฟล์จะมีขนาดเท่าใด
คำถามที่พบบ่อย
บทเรียน “JSON และ CSV แบบสตรีม” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “JSON และ CSV แบบสตรีม” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Go Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Go Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “JSON และ CSV แบบสตรีม”
json.Decoder และ encoding/csv สำหรับข้อมูลขนาดใหญ่ คุณปฏิบัติ Go Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Go Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Go Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 4 จากทั้งหมด 4 บทเรียน
บทเรียน “JSON และ CSV แบบสตรีม” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Go Academy นี้ได้ไหม
ได้ บทเรียน Go Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- อ่านไฟล์ด้วย os และ bufio
- การเขียนไฟล์และไฟล์ชั่วคราว
- การเข้ารหัสและถอดรหัส JSON
- JSON และ CSV แบบสตรีม