FasterCSV учебник для импорта данных в базу данных? - PullRequest
2 голосов
/ 04 июня 2011

Кто-нибудь знает какие-либо учебные пособия, демонстрирующие, как импортировать данные в приложение Ruby с помощью FasterCSV и сохранять их в базе данных SQLite или MySQL?

Вот конкретные шаги:

  1. Чтение файла построчно (метод .foreach делает это согласно документации)
  2. Отображение имен заголовков в файле с именами столбцов базы данных
  3. Создание записей в базе данных для данных CSV (кажется, выполнимо с .new и .save в блоке .foreach)

Это базовый сценарий использования, но я не смог найти для него никаких учебных пособий, поэтому любые ресурсы были бы полезны.

Спасибо!

Ответы [ 4 ]

2 голосов
/ 05 июня 2011

Похоже, что FasterCSV теперь является частью ядра Ruby начиная с Ruby 1.9, так что это то, что я в итоге сделал, чтобы достичь целей, указанных в моем вопросе выше:

@importedfile = Import.find(params[:id])
filename = @importedfile.csv.path
CSV.foreach(filename, {:headers => true}) do |row|
  @post = Post.find_or_create_by_email(
    :content          =>  row[0],
    :name             =>  row[1],
    :blog_url         =>  row[2],
    :email            =>  row[3]
  )
end
flash[:notice] = "New posts were successfully processed."
redirect_to posts_path

Внутри функции find_or_create_by_email находится сопоставление столбцов базы данных со столбцами файла CSV: row[0], row[1], row[2], row[3].

Поскольку это find_or_create функция, мне не нужно явно вызывать @post.save, чтобы сохранить запись в базе данных.

Если есть лучший способ, пожалуйста, обновите или добавьте свой собственный ответ.

0 голосов
/ 13 июля 2012

Это самый короткий путь, если вы можете использовать идентификатор для идентификации записей и если нет необходимости в отображении имен столбцов:

CSV.foreach(filename, {:headers => true}) do |row|
  post = Post.find_or_create_by_id row["id"]
  post.update_attributes row.to_hash
end
0 голосов
/ 05 июня 2011

Ruby отлично подходит для развертывания ваших собственных процедур импорта.

  1. Чтение файла (удобная блочная структура, обеспечивающая правильное закрытие дескриптора файла):

    File.open( filepath ) do |f|
      f.each_line do |line|
        do something with the line...
      end
    end
    
  2. Отображение имен заголовков в столбцы (возможно, вы захотите проверить совпадение длин массивов):

    Hash[header_array.zip( line_array )]
    
  3. Создание записей в базе данных с использованием activerecord:

    SomeModel.create( Hash[header_array.zip( line_array )] )
    

Похоже, вы планируете позволить пользователям загружать CSV-файлы и импортировать их в базу данных.Это вызывает проблемы, если они не разбираются в данных.Возможно, вы захотите взглянуть на решение nosql, чтобы упростить процесс импорта.

0 голосов
/ 04 июня 2011

Сначала начните с ответов на другие вопросы о переполнении стека: Лучший способ читать CSV в Ruby.FasterCSV?

Прежде чем приступить к написанию кода, я проверяю, существует ли существующий инструмент для импорта.Возможно, вы захотите взглянуть на mysqlimport .

. Это простой пример, показывающий, как сопоставить заголовки CSV со столбцами базы данных:

require "csv"

data = <<EOT
header1, header2, header 3
1, 2, 3
2, 2, 3
3, 2, 3
EOT

header_to_table_columns = {
  'header1'  => 'col1',
  'header2'  => 'col2',
  'header 3' => 'col3'
}

arr_of_arrs = CSV.parse(data)
headers = arr_of_arrs.shift.map{ |i| i.strip }
db_cols = header_to_table_columns.values_at(*headers)
arr_of_arrs.each do |ary|
  # insert into the database using an ORM or by creating insert statements
end
...