Использование Ruby для автоматизации большой системы каталогов

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

#This script is to create a file structure for our survey data

require 'fileutils'

f = File.open('CustomerList.txt') or die "Unable to open file..."
a = f.readlines
x = 0

while a[x] != nil

    Customer = a[x]
    FileUtils.mkdir_p(Customer + "/foo/bar/orders")
    FileUtils.mkdir_p(Customer + "/foo/bar/employees")
    FileUtils.mkdir_p(Customer + "/foo/bar/comments")
    x += 1

end

Кажется, все работает до while, но я продолжаю получать:

'mkdir': Invalid argument - Cust001_JohnJacobSmith(JJS) (Errno::EINVAL)

Который будет первой строкой из CustomerList.txt, Нужно ли что-то делать с записью массива, чтобы она считалась строкой?

1 ответ

Решение

Следующее работало для меня:

IO.foreach('CustomerList.txt') do |customer|
  customer.chomp!
  ["orders", "employees", "comments"].each do |dir|
    FileUtils.mkdir_p("#{customer}/foo/bar/#{dir}")
  end
end

с данными вот так:

$ cat CustomerList.txt 
Cust001_JohnJacobSmith(JJS)
Cust003_JohnJacobSmith(JJS)
Cust002_JohnJacobSmith(JJS)

Несколько вещей, чтобы сделать его более похожим на рубиновый:

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

Как отмечает @inger, локальные переменные начинаются со строчной буквы, customer.

Когда вы хотите, чтобы значение переменной в строке usign #{} было более рубиновым, чем конкатенация с +.

Также обратите внимание, что мы сняли завершающий символ новой строки, используя chomp! (который изменяет переменную на месте, отмеченную буквой! в имени метода)

Другие вопросы по тегам