13
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调用中产生,我将它们添加到一个数组中并返回它。

如何使用单个数组完成此操作?

4

3 回答 3

51

只需将文件扩展名放在一组中:

Dir[path + "/**/*.{csv,xls}"]
于 2016-03-29T20:43:35.863 回答
14

好吧,让步很简单。只是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

虽然这个块/过程转换是一个有点高级的话题。

于 2013-06-05T15:32:41.413 回答
2
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 文件。构建一个文件名数组可能不是您真正想要的,尤其是在它们很多的情况下。在这种情况下,如果您不需要文件计数,则使用 Dir.glob 返回的 Enumerator 的方法会更合适。

于 2013-06-05T15:57:02.880 回答