Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Ruby

วิธีอ่านและแยกวิเคราะห์ไฟล์ CSV ด้วย Ruby

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) วิธีการด้วยบล็อก ซึ่งจะอ่านทีละแถวและใช้หน่วยความจำน้อยกว่ามาก

โปรดแชร์บทความนี้เพื่อให้คนอื่นค้นหาเจอ!