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

ファイル拡張子を 1 つのグループにまとめるだけです。

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 に答える