ฉันจะสร้างสำเนาของคอลัมน์บางคอลัมน์ของไฟล์ CSV ใน Ruby ที่มีข้อมูลต่างกันในคอลัมน์เดียวได้อย่างไร


85

ฉันมีไฟล์ CSV ชื่อ "A.csv" ฉันต้องการสร้างไฟล์ CSV ใหม่ชื่อ "B.csv" โดยใช้ข้อมูลจาก "A.csv"

ฉันจะใช้คอลัมน์ย่อยจาก "A.csv" และจะต้องอัปเดตค่าของคอลัมน์หนึ่งเป็นค่าใหม่ใน "B.csv" ในท้ายที่สุดฉันจะใช้ข้อมูลนี้จาก B.csv เพื่อตรวจสอบกับฐานข้อมูล

  1. ฉันจะสร้างไฟล์ CSV ใหม่ได้อย่างไร
  2. ฉันจะคัดลอกข้อมูลคอลัมน์ที่ต้องการจาก A.csv เป็น "B.csv" ได้อย่างไร
  3. ฉันจะผนวกค่าสำหรับคอลัมน์ใดคอลัมน์หนึ่งได้อย่างไร

ฉันยังใหม่กับ Ruby แต่ฉันสามารถอ่าน CSV เพื่อรับอาร์เรย์หรือแฮชได้


2
สิ่งนี้ขาดข้อมูลพื้นฐานเช่นแสดงให้เราเห็นถึงความพยายามของคุณในการแก้ปัญหา ข้อมูลนี้อยู่ในเอกสาร CSV อ่าน " วิธีถาม " และ " ตัวอย่างที่ทำซ้ำได้น้อยที่สุด "
The Tin Man

คำตอบ:


193

ดังที่ mikeb ชี้ให้เห็นมีเอกสาร - http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html - หรือคุณสามารถทำตามตัวอย่างด้านล่าง (ทั้งหมดผ่านการทดสอบและ ทำงาน):

ในการสร้างไฟล์ใหม่:

ในไฟล์นี้เราจะมีสองแถวแถวส่วนหัวและแถวข้อมูล CSV ที่เรียบง่ายมาก:

require "csv"
CSV.open("file.csv", "wb") do |csv|
  csv << ["animal", "count", "price"]
  csv << ["fox", "1", "$90.00"]
end

ผลลัพธ์ไฟล์ชื่อ "file.csv" ดังต่อไปนี้:

animal,count,price
fox,1,$90.00

วิธีผนวกข้อมูลเข้ากับไฟล์ CSV

เกือบจะเป็นสูตรเดียวกับข้างบนเท่านั้นแทนที่จะใช้โหมด "wb" เราจะใช้โหมด "a +" สำหรับข้อมูลเพิ่มเติมเกี่ยวกับสิ่งเหล่านี้โปรดดูคำตอบของสแตกล้นนี้: โหมดและตัวเลือก Ruby File.open คืออะไร

CSV.open("file.csv", "a+") do |csv|
  csv << ["cow", "3","2500"]
end

ตอนนี้เมื่อเราเปิด file.csv เรามี:

animal,count,price
fox,1,$90.00
cow,3,2500

อ่านจากไฟล์ CSV ของเรา

ตอนนี้คุณรู้วิธีคัดลอกและเขียนลงไฟล์เพื่ออ่าน CSV แล้วจึงหยิบข้อมูลสำหรับการจัดการที่คุณเพิ่งทำ:

CSV.foreach("file.csv") do |row|
  puts row #first row would be ["animal", "count", "price"] - etc.
end

แน่นอนว่านี่เป็นเหมือนหนึ่งในหลายร้อยวิธีที่คุณสามารถดึงข้อมูลจาก CSV โดยใช้อัญมณีนี้ สำหรับข้อมูลเพิ่มเติมฉันขอแนะนำให้ไปที่เอกสารทันทีที่คุณมีไพรเมอร์: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


จะทำอย่างไรถ้าฉันต้องการเปิดโดยไม่เขียนถึงทันที? แค่ไม่ใช้บล็อก?
Donato

ขอบคุณสำหรับการคัดลอกและวางรหัสที่สามารถ! - ขี้เกียจเขียน
DominikAngerer

ซึ่งครอบคลุมถึงการสร้าง CSV ใหม่ แต่จากนั้นจะไปที่ข้อมูลเกี่ยวกับการเพิ่มและอ่านทั้งแถวแทนที่จะตอบสนองคำขอให้คัดลอกส่วนย่อยของ coumns ที่มีอยู่และแก้ไขหรือเพิ่มค่า ฉันมีโครงการประเภทเดียวกันกับ OP และเอกสารหรือคำตอบนี้ไม่ได้รับการช่วยเหลือดังนั้นหวังว่าฉันจะกลับมาที่นี่เพื่อให้คำตอบที่เฉพาะเจาะจงมากขึ้นเมื่อฉันเข้าใจ
Tyler James Young

4

คุณเคยเห็นคลาส CSV ของทับทิมหรือไม่? ดูเหมือนจะค่อนข้างครอบคลุม ตรวจสอบได้ที่นี่: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html


1
ขอบคุณสำหรับลิงค์ ฉันจะอ้างถึงมัน ฉันสามารถแก้ไขไฟล์ csv ผ่าน Ruby ได้หรือไม่? ฉันหมายความว่าฉันสามารถอัปเดตค่าคอลัมน์ใน csv ได้หรือไม่ ภายหลังได้รับแฮชของคอลัมน์ที่จำเป็นเท่านั้น?
user1718712

0

คุณอาจต้องการใช้CSV::parseเพื่อช่วยให้ Ruby เข้าใจ CSV ของคุณเป็นตารางข้อมูลที่เป็นและช่วยให้เข้าถึงค่าได้ง่ายตามส่วนหัว

น่าเสียดายที่เอกสารที่CSV::parseมีอยู่เกี่ยวกับวิธีการนี้ไม่ได้ระบุชัดเจนว่าจะใช้เพื่อวัตถุประสงค์นี้อย่างไร

ฉันมีงานที่คล้ายกันและได้รับการช่วยเหลือมากขึ้นจากHow to Read & Parse CSV Files With Rubyบน rubyguides.com มากกว่าเอกสารประกอบคลาส CSV หรือตามคำตอบที่ชี้ไปจากที่นี่

ฉันขอแนะนำให้อ่านหน้านั้นอย่างครบถ้วน ส่วนสำคัญคือการเปลี่ยน CSV ที่กำหนดให้เป็นCSV::Tableวัตถุโดยใช้:

table = CSV.parse(File.read("cats.csv"), headers: true)

ขณะนี้มีเอกสารประกอบเกี่ยวกับCSV::Tableชั้นเรียนแต่คุณอาจได้รับความช่วยเหลือมากขึ้นอีกครั้งจากตัวอย่างที่ชัดเจนในหน้า rubyguides.com สิ่งหนึ่งที่ผมจะเน้นก็คือว่าเมื่อคุณบอกที่คาดหวังส่วนหัวของตารางผลจะรักษาแถวแรกของข้อมูลเป็นแถว.parse[0]

คุณอาจสนใจเป็นพิเศษใน.by_colวิธีการที่มีให้สำหรับTableวัตถุใหม่ของคุณ สิ่งนี้จะช่วยให้คุณวนซ้ำผ่านตำแหน่งดัชนีคอลัมน์ต่างๆในอินพุตและ / หรือเอาต์พุตและคัดลอกจากที่หนึ่งไปยังอีกที่หนึ่งหรือเพิ่มค่าใหม่ให้กับเอาต์พุต ถ้าได้ผลฉันจะกลับมาโพสต์ตัวอย่าง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.