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

ser*_*erg 12 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
Run Code Online (Sandbox Code Playgroud)

我正在尝试在Ruby中创建一个简单的脚本,允许我从命令行调用它,就像ruby counter.rb mailing_list1它进入文件夹并计算所有.csv和.xls文件.

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

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

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

如何使用单个阵列完成此操作?

C J*_*son 44

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

Dir[path + "/**/*.{csv,xls}"]
Run Code Online (Sandbox Code Playgroud)

  • IMO,这是一个更为红宝石的答案.这是一条线,清晰易读.虽然,我会这样做:Dir ["#{path}/**/*.{csv,xls}]显然是另外六个中的六个. (2认同)

Ser*_*sev 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
Run Code Online (Sandbox Code Playgroud)

ruby中的每个方法都可以传递一个块.和yield关键词发送数据到该块.如果可能提供或不提供块,yield通常与block_given?.

yield f if block_given?
Run Code Online (Sandbox Code Playgroud)

更新

通过将块直接传递给以下代码,可以进一步简化代码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
Run Code Online (Sandbox Code Playgroud)

虽然这个块/ proc转换是一个有点高级的主题.