Dir.glob获取文件夹中的所有csv和xls文件

时间:2013-06-05 15:29:24

标签: ruby arrays yield dir

folder_to_analyze = ARGV.first
folder_path = File.join(Dir.pwd, folder_to_analyze)

unless File.directory?(folder_path)
  puts "Error: #{folder_path} no es un folder valido."
  exit
end

def get_csv_file_paths(path)
  files = []
  Dir.glob(path + '/**/*.csv').each do |f|
    files << f
  end
  return files
end

def get_xlsx_file_path(path)
  files = []
  Dir.glob(path + '/**/*.xls').each do |f|
    files << f
  end
  return files
end

files_to_process = []
files_to_process << get_csv_file_paths(folder_path)
files_to_process << get_xlsx_file_path(folder_path)
puts files_to_process[1].length # Not what I want, I want:
# puts files_to_process.length

我正在尝试在Ruby中创建一个简单的脚本,允许我从命令行调用它,如ruby counter.rb mailing_list1,它会转到该文件夹​​并计算所有.csv和.xls文件。

我打算对每个文件进行操作,获取行数等等。

目前files_to_process数组实际上是一个数组数组 - 我不希望这样。我想要一个.csv和.xls文件的单个数组。

由于我不知道如何从Dir.glob调用中获取,我将它们添加到数组中并返回它。

如何使用单个数组实现此目的?

3 个答案:

答案 0 :(得分:38)

只需将文件扩展名粘贴到一个组中即可:

Dir[path + "/**/*.{csv,xls}"]

答案 1 :(得分:13)

嗯,屈服很简单。只需yield

def get_csv_file_paths(path)
  Dir.glob(path + '/**/*.csv').each do |f|
    yield f
  end
end

def get_xlsx_file_path(path)
  Dir.glob(path + '/**/*.xls').each do |f|
    yield f
  end
end

files_to_process = []
get_csv_file_paths(folder_path) {|f| files_to_process << f }
get_xlsx_file_path(folder_path) {|f| files_to_process << f }

puts files_to_process.length

ruby​​中的每个方法都可以传递一个块。 yield关键字将数据发送到该块。如果可能提供或未提供该块,则yield通常与block_given?一起使用。

yield f if block_given?

更新

通过将块直接传递给glob.each

,可以进一步简化代码
def get_csv_file_paths(path, &block)
  Dir.glob(path + '/**/*.txt').each(&block)
end

def get_xlsx_file_path(path, &block)
  Dir.glob(path + '/**/*.xls').each(&block)
end

虽然这个块/ proc转换是一个高级主题。

答案 2 :(得分:1)

def get_folder_paths(root_path)
  Dir.glob('**/*.csv') + Dir.glob('**/*.xls')
end

folder_path = File.join(Dir.pwd, ARGV.first || '')
raise "#{folder_path} is not a valid folder" unless File.directory?(folder_path)

puts get_folder_paths(folder_path).length

get_folder_paths方法返回CSV和XLS文件的数组。构建一个文件名数组可能不是你真正想要的,特别是如果它们有 lot 。如果您不需要首先使用文件计数,那么使用Dir.glob返回的枚举器的方法会更合适。