2014-11-28 2 views
0

У меня есть только два файла внутри одной папки.Используйте File.readlines для чтения строки из отдельного файла Ruby

"seed.rb", которая содержит данные семян:

Jones,James 
Williams,Violet 
Walton,Briggs 

"code.rb", который содержит код:

require_relative 'seed' 

class TransferInformation 
    def read_seed_data_from_file(filename) 
    File.readlines(filename).each do |line| 
     puts line 
    end 
    end 
end 

read_seed_data_from_file(seed) 

В консоли, я побежал ruby code.rb.

Ошибка, которую я получаю сейчас, является «неожиданным завершением ввода для строки 3 в seed.rb».

ответ

2

«seed.rb» не является файлом Ruby. Не используйте require (или require_relative) нерубильные файлы. Просто удалите require_relative.

Я также предлагаю переименовать «seed.rb» в нечто менее обманчивое, например «seed.csv» (обычное расширение для comma-separated values file).

+0

Когда я вынимаю require_relative и меняю seed.rb на seed.csv, а затем запускаю ruby ​​code.rb в консоли, теперь получаю - неопределенную локальную переменную или метод «семя». –

+0

'read_seed_data_from_file (" seed.cvs ")'. 'seed' будет переменной, и это, как говорит ошибка, не определено. – Amadan

+0

удивительный. Спасибо. и затем я запускаю этот «ruby -r» ./code.rb «-e» TransferInformation.new.read_seed_data_from_file («seed.csv») «из командной строки, и он отлично работает. –

2

Во-первых, имейте в виду, что есть стандарт для файлов CSV. Его часто игнорируют люди, которые пытаются перевернуть свой собственный код, чтобы читать и писать, но стандарт остается. И, используя предварительно созданные колеса, например, the CSV class, который поставляется с Ruby, ваши шансы на создание правильных CSV-данных идут вверх, как и ваши шансы на чтение.

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

CSV.foreach("path/to/file.csv") do |row| 
    # use row here... 
end 

так читать ваши данные:

require 'csv' 

CSV.foreach("test.csv") do |row| 
    puts row.reverse.join(' ') 
end 

Запуск выводит:

James Jones 
Violet Williams 
Briggs Walton 

Вы хотите читать CSV строку -by-line большую часть времени, потому что вас беспокоит только одна строка. Дампы базы данных часто бывают в формате CSV, и при попытке до read весь файл дампа огромной базы данных сразу («раздвоение») может отменить вашу программу.

Теперь некоторые комментарии о коде:

  • TransferInformation не хорошее имя для класса. Класс должен быть таким, как «IncomingData», «Data» или «UserNames» или «Names». Методы - это действия или глаголы.
  • Вы не можете сказать

    read_seed_data_from_file(seed) 
    

    потому, что метод является частью класса передачи информации. Вам нужно создать экземпляр класса, то вы можете вызвать метод:

    ta = TransferInformation.new 
    ta.read_seed_data_from_file('test.csv') 
    

Это выглядит правильно, но не был проверен.

Смежные вопросы