CSV ย่อมาจาก “Comma-Separated Values”
เป็นรูปแบบข้อมูลทั่วไปซึ่งประกอบด้วยแถวที่มีค่าคั่นด้วยเครื่องหมายจุลภาค ใช้สำหรับการส่งออกและนำเข้าข้อมูล
ตัวอย่างเช่น :
คุณสามารถส่งออกรายชื่อติดต่อ Gmail เป็นไฟล์ CSV และนำเข้าโดยใช้รูปแบบเดียวกันได้
นี่คือลักษณะของไฟล์ CSV :
id,name 1,chocolate 2,bacon 3,apple 4,banana 5,almonds
ตอนนี้คุณจะได้เรียนรู้วิธีใช้ ไลบรารี Ruby CSV เพื่ออ่านและเขียนไฟล์ CSV
การแยกวิเคราะห์ Ruby CSV
Ruby มาพร้อมกับไลบรารี CSV ในตัว
คุณสามารถอ่านไฟล์ได้โดยตรง :
require 'csv' CSV.read("favorite_foods.csv")
หรือคุณสามารถแยกวิเคราะห์สตริงด้วยข้อมูล CSV :
require 'csv' CSV.parse("1,chocolate\n2,bacon\n3,apple")
ผลลัพธ์?
คุณจะได้อาร์เรย์สองมิติที่ทุกรายการเป็นหนึ่งแถวในตาราง
หน้าตาเป็นแบบนี้ :
[ ["id", "name"], ["1", "chocolate"], ["2", "bacon"], ["3", "apple"], ["4", "banana"], ["5", "almonds"] ]
คุณสามารถใช้ดัชนีอาร์เรย์ เช่น data[1][1]
เพื่อทำงานกับข้อมูลนี้
แต่มันมีวิธีที่ดีกว่า!
ตัวเลือก CSV
หากไฟล์ของคุณมีส่วนหัว คุณสามารถบอกให้โปรแกรมแยกวิเคราะห์ CSV ใช้งานได้
ถูกใจสิ่งนี้ :
table = CSV.parse(File.read("cats.csv"), headers: true)
ตอนนี้แทนที่จะเป็นอาร์เรย์หลายมิติ คุณจะได้รับวัตถุตาราง CSV
นี่คือคำอธิบาย :
“A
CSV::Table
เป็นโครงสร้างข้อมูลสองมิติสำหรับแสดงเอกสาร CSV ตารางช่วยให้คุณทำงานกับข้อมูลตามแถวหรือคอลัมน์ จัดการข้อมูล และแม้กระทั่งแปลงผลลัพธ์กลับเป็น CSV”
ด้วยตารางเหล่านี้ คุณสามารถรับข้อมูลที่ต้องการจากแถวใดก็ได้
ตัวอย่าง :
table[0]["id"] # "1" table[0]["name"] # "chocolate"
ที่นี่ 0
คือแถวแรก id
&name
คือชื่อคอลัมน์
มีสองโหมดตาราง :
- by_col
- by_row
โดยการเปลี่ยนโหมดตาราง (row
โดยค่าเริ่มต้น) คุณสามารถดูข้อมูลจากมุมต่างๆ ได้
ตัวอย่างเช่น :
table.by_col[0] # ["1", "2", "3", "4", "5"] table.by_col[1] # ["chocolate", "bacon", "apple", "banana", "almonds"]
ที่นี่ 0
เป็นคอลัมน์แรก 1
เป็นคอลัมน์ที่สอง
สองวิธีนี้ส่งคืน สำเนาของตาราง .
หากคุณต้องการเปลี่ยนแปลงตารางต้นฉบับ คุณสามารถใช้ by_col!
&by_row!
วิธีการ
สิ่งนี้จะทำให้หน่วยความจำมีประสิทธิภาพมากขึ้นเพราะไม่มีการสร้างสำเนาของตาราง
วิธีใช้ตัวแปลง CSV
คุณอาจสังเกตเห็นว่าเราได้รับ id
. ของเรา คอลัมน์เป็นอาร์เรย์ของสตริง
จะเป็นอย่างไรถ้าเราต้องการจำนวนเต็ม
คุณสามารถรับได้โดยโทร to_i
ในแต่ละสาย…
แต่มีทางลัด!
ไลบรารี Ruby CSV นำสิ่งที่เรียกว่า ตัวแปลง .
ตัวแปลงจะแปลงค่าให้คุณโดยอัตโนมัติ
ตัวอย่างเช่น :
CSV.parse("1,2,3,4,5") # [["1", "2", "3", "4", "5"]] CSV.parse("1,2,3,4,5", converters: :numeric) # [[1, 2, 3, 4, 5]]
มีตัวแปลงในตัว 6 ตัว :
- จำนวนเต็ม
- ลอย
- ตัวเลข (ลอย + จำนวนเต็ม)
- วันที่
- วันที่เวลา
- ทั้งหมด
แต่คุณยังสร้างตัวแปลงที่กำหนดเองได้
ตามนี้ :
CSV::Converters[:symbol] = ->(value) { value.to_sym rescue value }
คุณสามารถใช้ตัวแปลงใหม่เช่นนี้ :
CSV.parse("a,b,c", headers: false, converters: :symbol) # [[:a, :b, :c]]
วิธีสร้างไฟล์ CSV ใหม่
นอกจากความสามารถในการแยกวิเคราะห์และอ่านไฟล์ CSV ในรูปแบบต่างๆ แล้ว คุณยังสามารถสร้าง CSV ตั้งแต่ต้นได้อีกด้วย
นี่เป็นวิธีที่ง่าย :
cats = [ [:blue, 1], [:white, 2], [:black_and_white, 3] ] cats.map { |c| c.join(",") }.join("\n")
คุณยังสามารถใช้ generate
วิธีการ:
CSV.generate do |csv| csv << [:blue, 1] csv << [:white, 2] csv << [:black_and_white, 3] end
เป็นการเตรียมข้อมูลให้อยู่ในรูปแบบที่ถูกต้อง
หากคุณต้องการเขียนไปยังไฟล์ คุณจะต้องใช้บางอย่างเช่น File.write("cats.csv", data)
หรือแทนที่จะ generate
คุณสามารถใช้ open
โดยเปิดใช้ชื่อไฟล์และโหมดเขียน
ถูกใจสิ่งนี้ :
CSV.open("cats.csv", "w") do |csv| csv << [:white, 2] end
ตอนนี้คุณมีไฟล์ CSV ใหม่แล้ว!
อัญมณีและประสิทธิภาพ CSV
ห้องสมุดในตัวใช้งานได้ดี &จะทำงานให้เสร็จ
แต่คุณยังหา CSV แยกวิเคราะห์ Gem ที่มีฟีเจอร์ต่างๆ ได้
ตัวอย่างเช่น smarter_csv
gem จะแปลงข้อมูล CSV ของคุณเป็นอาร์เรย์ของแฮช
ตัวอย่าง :
require 'smarter_csv' IntegerConverter = Object.new def IntegerConverter.convert(value) Integer(value) end SmarterCSV.process('testing.csv', value_converters: { id: IntegerConverter }) # [{:id=>1, :name=>"a"}, {:id=>2, :name=>"b"}, {:id=>3, :name=>"c"}]
นี่คือการเปรียบเทียบประสิทธิภาพ :
Comparison: CSV: 112.9 i/s Smarter CSV: 21.7 i/s - 5.21x slower Tabular: 17.3 i/s - 6.52x slower
สรุป
คุณได้เรียนรู้วิธีการอ่านและเขียนไฟล์ CSV ใน Ruby แล้ว! คุณยังได้เรียนรู้เกี่ยวกับตัวแปลงและ Ruby gem ทางเลือกในการประมวลผลข้อมูล CSV ของคุณ
หากคุณต้องการ ประมวลผลไฟล์ CSV ขนาดใหญ่ (> 10MB) คุณอาจต้องการใช้ CSV.foreach(file_name)
วิธีการด้วยบล็อก ซึ่งจะอ่านทีละแถวและใช้หน่วยความจำน้อยกว่ามาก
โปรดแชร์บทความนี้เพื่อให้คนอื่นค้นหาเจอ!