前提・実現したいこと
動作環境
Ubuntu 20.04
Ruby 2.7.2
- カレントディレクトリ配下のディレクトリ
cfg/
以下に配置した複数ファイルに対して、
繰り返し処理を行い、結果をファイル出力したいと考えています。
- 入力ファイルが200件ほどあり、内部のデータも多いため、
できれば入力ファイル1つに対して、出力ファイルを1つ生成したいです。
参考
nagiosのhosts.cfgをCSV形式に変換するスクリプト
ディレクトリ内にあるファイル名を配列に入れる
Ruby:ディレクトリ(フォルダ)内の特定のファイル数を数える。
発生している問題・エラーメッセージ
出力結果をリダイレクトして、ファイルに書き出そうとしましたが、出力結果が得られません。
$ sudo ruby ./cfg2csv.rb ./cfg >> nagios.csv
また、Dir.open
について、ファイル名を配列として受け取ることが出来ませんでした。
No such file or directory @ dir_initialize - ./cfg/*.cfg (Errno::ENOENT)
該当のソースコード
ruby
1 1 #!/bin/bash 2 2 exec ruby -S -x $0 "$@" 3 3 #! ruby 4 4 delimiter=',' 5 5 6 6 infolder = ARGV[0] 7 - 7 filenames = Dir.open("#{infolder}/*.cfg") 8+ 7 filenames = Dir.glob("#{infolder}/*.cfg") 9 8 10 9 n = 0 11 10 12 11 for outfile in filenames do 13 12 14 13 configs = [] 15 14 values = [] 16 15 keys = [] 17 -16 files = "./#{filenames("#{n}")}.cfg" 18+16 files = "infolder(n)" 19 17 20 18 files.each_line do |line| 21 19 22 20 next if /^\s*$/ =~ line 23 21 next if /^#/ =~ line 24 22 if 'define host{' == line.strip 25 23 next 26 24 elsif '}' == line.strip 27 25 configs.push(values) 28 26 values = [] 29 27 else 30 28 key, value = line.strip.match(/^([^\s#;]*)\s*([^#;]*).*$/)[1..2] 31 29 keys.push(key) unless keys.include?(key) 32 30 values.push(key => value.gsub(/,/,"|")) 33 31 end 34 32 end 35 33 puts keys.join(delimiter) 36 34 configs.each do |cfg| 37 35 line = [] 38 36 cfg.each do |item| 39 37 key_num = keys.index(item.keys.join) 40 38 line[key_num] = item.values.join 41 39 end 42 40 puts line.join(delimiter) 43 41 end 44 42 45 43 n =+ 1 46 44 p outfile 47 45 48 46 end
試したこと
参考サイトのスクリプト自体の動作は確認できましたが、
繰り返し処理の記述がうまく行かず出力結果を得ることが出来ませんでした。
また、ファイル名を配列として取得してそれぞれに処理を適用しようとしましたが、
配列としての取得がうまくいきませんでした。
ご助言のほど、何卒宜しくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/14 00:50
2020/10/14 04:15
2020/10/19 01:22
2020/10/19 02:46