Вот краткий рецензирование вашего кода, что-то похожее на то, что вы получите в корпоративной среде ...
Вместо того, чтобы писать:
input_folder = "H:/input"
input_folder[input_folder.length-1,1] == '/' # => false
Подумайте об этом, используя-1
смещение от конца строки для доступа к символу:
input_folder[-1] # => "t"
Это упрощает вашу логику, делая ее более читабельной, поскольку в ней отсутствует лишний визуальный шум:
input_folder[-1] == '/' # => false
См. []
и []=
в документации по String.
Для меня это выглядит как ошибка:
files = Dir[input_folder + '/*.xml'].sort_by{ |f| File.mtime(f)}
file = File.read(input_folder + '/' + files)
files
- это массив имен файлов.input_folder + '/' + files
добавляет массив к строке:
foo = ['1', '2'] # => ["1", "2"]
'/parent/' + foo # =>
# ~> -:9:in `+': no implicit conversion of Array into String (TypeError)
# ~> from -:9:in `<main>'
То, как вы хотите справиться с этим, оставлено в качестве упражнения для программиста.
doc.traverse do |node|
является неприличнымпотому что он обходит возможности Nokogiri, чтобы найти конкретный тег с помощью аксессоров.Очень редко нам нужно перебирать тег документа по тегу, обычно только когда мы заглядываем в его структуру и макет.traverse
медленнее, поэтому используйте его в качестве крайней меры.
length
хорошо, но не нужно при проверке наличия в строке содержимого:
value = 'foo'
value.length > 0 # => true
value > '' # => true
value = ''
value.length > 0 # => false
value > '' # => false
Программисты, работающие на Java, любят использовать средства доступа, но мне нравится быть ленивым, вероятно, из-за моего опыта работы с C и Perl.
Будьте осторожны с sub
и gsub
, поскольку они не делают то, что делаютВы думаете, что они делают.Оба ожидают регулярное выражение, но перед началом сканирования получат строку, с которой они выполняют escape
.
Вы передаете регулярное выражение, что нормально в этомслучай, но это может вызвать неожиданные проблемы, если вы не помните все правила для сопоставления с образцом и что gsub
сканирует до конца строки:
foo = 'wd:barwd:' # => "wd:barwd:"
key = foo.gsub(/wd:/,'') # => "bar"
В общем, я рекомендую людям подумать парураз перед использованием регулярных выражений.Я видел некоторые зияющие дыры, открытые в логике, написанной довольно продвинутыми программистами, потому что они не знали, что собирается делать движок.Они удивительно мощные, но их нужно использовать хирургически, а не как универсальное решение.
То же самое происходит со строкой, потому что gsub
не знает, когда выйти:
key = foo.gsub('wd:','') # => "bar"
Итак, если вы хотите изменить только первый экземпляр, используйте sub
:
key = foo.sub('wd:','') # => "barwd:"
Хотя я бы сделал это немного по-другому.
foo = 'wd:bar'
Я могу проверить, что означают первые три символа:
foo[0,3] # => "wd:"
Или я могу заменить их чем-то другим, используя индексирование строк:
foo[0,3] = ''
foo # => "bar"
Есть больше, но я думаю, что этого достаточно.