将原始日志文件数据转换为CSV文件

时间:2014-08-21 13:59:09

标签: ruby regex csv

我从日志文件中删除了一些原始数据,目前读取为:

"   80:  0.20%:  2/Jan/14 21:01: /site/podcasts/audio/2013/podcast-07-15-2013.mp3", 
"   71:  0.16%:  14/Jan/14 12:18: /site/podcasts/audio/2013/podcast-11-04-2013.mp3", 
"   67:  0.17%:  2/Jan/14 23:44: /site/podcasts/audio/podcast-3-21-2011.mp3", 
"   67:  0.15%:  15/Jan/14 09:25: /site/podcasts/audio/2013/podcast-08-05-2013.mp3", 
"   64:  0.12%:  2/Jan/14 07:40: /site/podcasts/audio/2013/podcast-11-04-2013-1.mp3",

我需要将收集的三条信息转换为Excel电子表格的数据 - 初始冒号,日期和URL之前的数字。因此,如果我将其转换为CSV,则会将其读作

80, 2/Jan/14, /site/podcasts/audio/2013/podcast-07-15-2013.mp3
71, 14/Jan/14, /site/podcasts/audio/2013/podcast-11-04-2013.mp3
67, 2/Jan/14, /site/podcasts/audio/podcast-3-21-2011.mp3

等等。但是,我无法弄清楚如何做到这一点。我写了一些正则数据来捕获正确的数据,但我不确定如何将这些正则表达式转换成我需要的。

这个正则表达式可以得到第一个数字:^"\s{3}(\d+)

这个正则表达式可以得到日期:(\d+\/\w{3}\/14)

此正则表达式可以获取网址:(\/site\/podcasts\/audio\/.*\.mp3)

但是,我不确定如何使用这些正则表达式并将它们转换为我需要的CSV。有什么想法吗?

3 个答案:

答案 0 :(得分:1)

这会将您的匹配放在一起,然后放在捕获组中,然后您可以在Ruby中处理它们。我不熟悉Ruby,但我想你可以连接捕获组返回的字符串。

^"\s{3}(\d+)(?:[\s:]|\d\.\d\d%)*(\d+\/\w{3}\/14)[\s\d:]*(\/site\/podcasts\/audio\/.*\.mp3)

Regular expression visualization

Debuggex Demo

答案 1 :(得分:1)

\s+(\d+):\s+.*?(\d+\/\w+\/\d+)\s+.*?(\/.*?)\".*

试试这个。请看一下演示。

http://regex101.com/r/cA4wE0/10

答案 2 :(得分:1)

我个人不会使用正则表达式:

output = ''
File.open("path/to/log", "r") do |f|
  f.each_line do |line|
    num, percent, date, time, url = line.split(/\s+/)
    num = num[0..-2]  # removes the colon from the end of the number
    output << "#{num}, #{date}, #{url}\n"
  end
end

# do whatever you want with the result
puts output

这打印:

80, 2/Jan/14, /site/podcasts/audio/2013/podcast-07-15-2013.mp3
71, 14/Jan/14, /site/podcasts/audio/2013/podcast-11-04-2013.mp3
67, 2/Jan/14, /site/podcasts/audio/podcast-3-21-2011.mp3
67, 15/Jan/14, /site/podcasts/audio/2013/podcast-08-05-2013.mp3
64, 2/Jan/14, /site/podcasts/audio/2013/podcast-11-04-2013-1.mp3

有更短,更聪明的方法来做到这一点,但我喜欢这种方式,因为它可读性和清晰。