2015-05-21 2 views
0

Изначально у меня есть пустой файл csv на моем компьютере. Я начинаю с этой кусочки кода:Я пишу в файл csv, но когда я его открываю, ничего нет

 CSV.open("GreenTea.csv", "wb") do |csv| 
     csv << ["ObjectID", "PropertyID", "PropertyValue", "SourceID"] 
    end 

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

.... 

    current = info.new 
    current.ObjectID = text[0] #Green tea 
    current.PropertyID = nil #Relation 
    current.PropertyValue = text[1] #description of antioxidant 
    current.SourceID = a['href'] #source extracted by clubweb 

    CSV.open("GreenTea.csv", "wb") do |csv| 
     csv << [current.ObjectID, current.PropertyID, current.PropertyValue, current.SourceID] 
    end 
end 

Однако, когда я снова проверить файл, я вижу только это: enter image description here

Похоже, что информация переписывается самой последней информацией в цикле! Как я могу предотвратить это? Я хочу добавить в файл не перезаписывать.

+0

Изменить открытый для использования 'ab': http://stackoverflow.com/questions/3507602/append-row-to-csv-file-ruby-1-9-csv-lib –

ответ

0

Вы открываете CSV с неправильными флагами.

"r" флаг открывает файл в режиме только для чтения.

Если вы хотите записать файл, вам нужно его открыть, используя режим w (запись), или a (напишите append).

CSV.open("GreenTea.csv", "ab") do |csv| 
    csv << [current.ObjectID, current.PropertyID, current.PropertyValue, current.SourceID] 
end 

Рубин позволяет сделать следующие открытые режимы:

  • "г" только для чтения, начинается в начале файла (режим по умолчанию).
  • «r +» Чтение-запись начинается с начала файла.
  • «w» Write-only, усекает существующий файл до нулевой длины или создает новый файл для записи.
  • «w +» Чтение-запись, усечение существующего файла до нулевой длины или создание нового файла для чтения и записи.
  • «a» Запись только для каждого вызова записи добавляет данные в конец файла. Создает новый файл для записи, если файл не существует.
  • «a +» Чтение-запись, каждый вызов записи добавляет данные в конец файла. Создает новый файл для чтения и записи, если файл не существует.
1

попробовать:

CSV.open("GreenTea.csv", "a+") do |csv| 
.... 

a+: Консервированные содержимое файла путем записи в конец файла, если файл не существует, он будет создан новый файл.

+0

Могу ли я добавить это ко второй части, которую я называю csv или первой? Когда я добавил его ко второй части, я получил отклоненную разрешенную ошибку. –

+2

@Sarahcartenz удалить файл или изменить разрешения. – DickieBoy

+0

@Sarah cartenz: DickieBoy прав! вы также можете добавить его к первому, если файл не существует, он создаст новый. – pangpang

1

Хотя оба уже представленных ответа выполняют свою работу, я бы пошел с другим подходом. Вместо того, чтобы повторно открывать файл csv додзеллионное количество раз, окружает весь процесс обработкой csv.Вместо (псевдокод):

my_table.each do |row| 
    CSV.open('file.csv', 'a+') do |csv| 
    puts ... 
    end 
end 

использования:

CSV.open('file.csv', 'w') do |csv| 
    csv << ["ObjectID", "PropertyID", "PropertyValue", "SourceID"] 
    my_table.each do |row| 
    csv << ... 
    end 
end 
1

Вы можете следить за следующий пример кода для генерации CSV, если вы используете приложение рельсы. при просмотре этого действия контроллера он загрузит файл csv с данными.

В application.rb требуют CSV

require 'csv' 

В вызове действия контроллера передачи данных и имя файла для генерации файла CSV

class ExampleController < ApplicationController 
def example_action 
    respond_to do |format| 
     format.csv { send_data ExampleModel.to_csv, :filename => "example.csv" } 
    end 
end 
end 

В модели to_csv генерировать строки CSV

class ExampleModel < ActiveRecord::Base 
    def self.to_csv 
    CSV.generate do |csv| 
     csv << ["Headers"] 
     csv << ["attributes"] 
    end 
    end 
end 
Смежные вопросы