Search code examples
rubyarraysfile-ioruby-1.9

Using Ruby to automate a large directory system


So I have the following little script to make a file setup for organizing reports that we get.

#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

Everything seems to work before the while, but I keep getting:

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

Which would be the first line from the CustomerList.txt. Do I need to do something to the array entry to be considered a string? Am I mismatching variable types or something?

Thanks in advance.


Solution

  • The following worked for me:

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

    with data like so:

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

    A few things to make it more like the ruby way:

    Use blocks when opening a file or iterating through arrays, that way you don't need to worry about closing the file or accessing the array directly.

    As noted by @inger, local vars start with lower case, customer.

    When you want the value of a variable in a string usign #{} is more rubinic than concatenating with +.

    Also note that we took off the trailing newline using chomp! (which changes the var in place, noted by the trailing ! on the method name)