Как мне создать копию некоторых столбцов файла 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, чтобы получить массив или хэш.

user1718712
источник
2
Здесь не хватает базовой информации, например, демонстрации ваших усилий по решению проблемы. Эта информация находится в документации CSV. Прочтите « Как задать вопрос » и « Минимальный воспроизводимый пример ».
Железный Человек
Возможный дубликат выходного массива в CSV на Ruby
phunehehe 01

Ответы:

193

Как отметил Микеб, есть документы - 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

newUserNameHere
источник
Что, если я захочу открыть, не написав сразу? Просто не использовать блок?
Донато
Спасибо за код, который можно скопировать и вставить! - лень писать это.
DominikAngerer
Это касается создания нового CSV, но затем переходит к информации о добавлении и чтении целых строк, а не о запросе на копирование подмножества доступных коумов и либо изменение, либо добавление их значений. У меня такой же проект, что и у OP, и мне не помогли ни документация, ни этот ответ, поэтому, надеюсь, я смогу вернуться сюда, чтобы дать более конкретный ответ, как только я это выясню.
Тайлер Джеймс Янг
4

Вы видели класс Ruby CSV? Это кажется довольно всеобъемлющим. Посмотрите здесь: http://ruby-doc.org/stdlib-1.9.3/libdoc/csv/rdoc/CSV.html

MikeB
источник
1
спасибо за ссылку. Я бы это имел в виду. Могу ли я отредактировать файл csv через ruby? Я имею в виду, могу ли я обновить значения столбца в csv? позже получить хэш только необходимых столбцов?
user1718712 04
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объекта. Это позволит вам перебирать различные позиции индекса столбца на входе и / или выходе и либо копировать из одного в другой, либо добавлять новое значение к выходу. Если у меня все заработает, я вернусь и опубликую пример.

Тайлер Джеймс Янг
источник