Як створити копію деяких стовпців файлу CSV у Ruby з різними даними в одному стовпці?


84

У мене є файл 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. Прочитайте " Як запитати " та " мінімально відтворюваний приклад ".
Олов'яна людина,

Відповіді:


191

Як зазначив Мікеб, є документи - 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

Тепер, коли ми відкриваємо наш файл.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


Що робити, якщо я хочу відразу відкрити, не написавши? Просто не використовуйте блок?
Донато

дякую за можливість копіювання та вставлення коду! - лінь писати це.
DominikAngerer

Це охоплює створення нового CSV, але потім переходить до інформації про додавання та читання цілих рядків, а не до звернення з проханням скопіювати підмножину доступних кумін і змінити або додати до їх значень. У мене такий же проект, як і в ОП, і документація чи відповідь не допомогли мені, тому, сподіваюся, я можу повернутися сюди, щоб надати більш конкретну відповідь, як тільки з’ясую.
Тайлер Джеймс Янг

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методу не дає зрозуміти, як насправді використовувати його для цієї мети.

У мене було подібне завдання, і мені набагато більше допомогло « Читання та аналіз файлів CSV за допомогою 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об’єкта. Це дозволить вам переглядати різні позиції індексу стовпців у вхідних та / або вихідних даних, або копіювати з одного на інший, або додавати нове значення до виводу. Якщо я змушу це працювати, я повернусь і розміщу приклад.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.