Ruby: Почему в конце всех строк моего массива есть `nil`? - PullRequest
0 голосов
/ 03 марта 2011

Итак, я написал некоторый код на Ruby, чтобы разбить текстовый файл на отдельные строки, а затем сгруппировать эти строки на основе символа разделителя. Затем этот вывод записывается в массив, который передается методу, который выплевывает HTML в текстовый файл. Я начал сталкиваться с проблемами, когда пытался использовать gsub в различных методах для замены заполнителей в текстовом файле HTML значениями из массива record - Руби продолжал говорить мне, что я передаю нулевые значения. Пытаясь отладить эту часть программы в течение нескольких часов, я решил поискать что-то еще, и, думаю, я кое-что понял. Модифицированная версия программы размещена ниже.

Вот пример входного текстового файла:

26188
WHL
1
Delco

B-7101
A-63
208-220/440
3
285  w/o pallet
1495.00

C:/img_converted/26188B.jpg
EDM Machine Part 2 of 3
AC Motor, 3/4 Hp, Frame 182, 1160 RPM
|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|

Вот фрагмент кода, с которым я тестировал:

# function to import file as a string

def file_as_string(filename)
    data = ''
    f = File.open(filename, "r")
    f.each_line do |line|
    data += line
end
return data
end

Dir.glob("single_listing.jma") do |filename|
content = file_as_string(filename)
content = content.gsub(/\t/, "\n")
database_array = Array.new
database_array = content.split("|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|--|")
for i in database_array do
    record = Array.new
    record = i.split("\n")
    puts record[0]
    puts record[0].class     end
end

Когда этот код запускается, я получаю этот вывод:

john@starfire:~/code/ruby/idealm_db_parser$ ruby putsarray.rb
26188
String
nil
NilClass

... что означает, что каждая позиция массива в record, очевидно, имеет данные типа String и типа nil. почему это?

1 Ответ

2 голосов
/ 03 марта 2011

Ваш database_array имеет больше размеров, чем вы думаете.

Ваш маркер конца строфы, |--|--|...|--|, после него стоит новая строка. Итак, file_as_string возвращает что-то вроде этого:

"26188\nWHL...|--|--|\n"

и затем split() в конце строфы во что-то вроде этого:

["26188\nWHL...1160 RPM\n", "\n"]  # <---- Note the last element here!

Затем вы снова разделяете каждый, но "\n".split("\n") дает пустой массив, первый элемент которого возвращается как nil.

...