【问题标题】:Parsing text files and generating a CSV解析文本文件并生成 CSV
【发布时间】:2011-12-23 23:36:27
【问题描述】:

我试图弄清楚如何解析一组包含原始日志数据的文件(crontab -l 的结果)并将这些数据转换为 CSV 文件。文件中的条目是这样的:

10,25,40,55 * * * * /some/cron/here > /dev/null 2>&1
30 */4 * * * /some/cron/here

等等。

我想将它们转换成 CSV 文件中的这种格式:

Cronjob | # of Servers | Every minute | Every hour | Every day | Every week | Every month
-----------------------------------------------------------------------------------------
CronHere| 10 | N | N | Y | Y | Y
CronHere| 8 | Y | N | N | Y | Y

等等。

谁能给我一些例子来说明我应该如何去做?

【问题讨论】:

  • 请注意,您的问题在术语上存在矛盾。 CSV 文件包含逗号分隔值 (CSV)。您的值有不同的分隔符。
  • @MetaEd:输入为crontab -l列表,所需输出为指定格式的CSV文件,此处不矛盾。
  • @muistooshort:他说输出文件不应该称为 CSV,因为它使用管道而不是逗号作为分隔符。迂腐,是的,即使大多数人会看到具有不同分隔符的 CSV 被解析和写入与带有逗号分隔符的 CSV 完全相同。
  • @CanSpice:我将“管道表”作为对格式的描述,但我可能错了(不会是第一次)。
  • 很抱歉,如果有任何混淆。我基本上只需要解析数据以将其转换为原始帖子中所述的格式,以便我可以将其导入电子表格。我正在尝试弄清楚如何在 ruby​​ 中做到这一点,但到目前为止还没有多少运气。

标签: ruby linux perl parsing csv


【解决方案1】:

感谢 ruby​​,这就是我最终完成这项任务的方式。

#!/usr/bin/ruby

crons = []
counts = []
cparts = []
basedir = "/logdirectory"
def YorN(part)
  if part == "*"
    "N"
  else
    "Y"
  end
end
Dir.new(basedir).entries.each do |logfile|
  unless File.directory? logfile
    if logfile.split('.')[1] == 'log'
      file = File.new(logfile, "r")
      while (line = file.gets)
        parts = line.split(' ')
        if parts[5,parts.length-5]
          cmd = parts[5,parts.length-5].join(' ')
          idx = crons.index(cmd)
          if idx
             counts[idx] += 1
          else
            crons << cmd
            idx = crons.index(cmd)
            counts[idx] = 1
            cparts[idx] = parts[0,5] # an Array containing another Array !
          end
        else
          puts "Error on: #{line} in file #{logfile}"
        end
      end
      file.close
    end
  end
end
# OUTPUT results
puts "# Servers  Min  Hour  DOM  Month DOW  Cronjob"
crons.each do |c|
  idx = crons.index(c)
  puts "#{counts[idx]} #{YorN(cparts[idx][0])} #{YorN(cparts[idx][1])} #{YorN(cparts[idx][2])} #{YorN(cparts[idx][3])} #{YorN(cparts[idx][4])} #{crons[idx]}"
end

【讨论】:

    【解决方案2】:

    这样的事情会让你开始:

    #!/usr/bin/env perl
    use strict;
    use warnings;
    while (<>) {
        chomp;
        my @line = split q( ), $_, 6;
        print join q(|), $line[5], @line[0..4], "\n";
    }
    

    至于枚举发生任务的服务器数量,您需要更好地定义如何区分任务 --- 仅通过名称,或通过完全匹配所有参数。完成此操作后,您可以使用哈希进行计数。

    【讨论】:

      【解决方案3】:

      您可以使用 Perl 正则表达式解析这些文件、排列数据并使用 Text::CSV 保存输出

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-08-08
        • 1970-01-01
        • 2017-10-10
        • 2017-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多