解析ruby中的位置文件

时间:2010-06-01 14:15:57

标签: ruby parsing

我有一个样本位置文件,如下所示。

789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423
742784897     COLORB        SOMETHING2      20060722FYY076    2342342342SDFSD3423

我对第54-61号职位感兴趣(第4栏)。我想将日期更改为不同的格式。所以最后的结果将是:

789754654     COLORA         SOMETHING1     01191937FYY076    2342423234SS323423
742784897     COLORB        SOMETHING2      07222006FYY076    2342342342SDFSD3423

列由空格而不是制表符分隔。并且最终文件应该具有确切的空格数作为原始文件....只有更改的东西应该是日期格式。我怎样才能做到这一点?我写了一个脚本,但它将丢失原始空间,定位将搞砸。

file.each_line do |line|
 dob = line.split(" ")
 puts dob[3] #got the date. change its format
 5.times {  puts "**" }
end

有人可以建议更好的策略,以便在原始文件中的定位保持不变吗?

4 个答案:

答案 0 :(得分:3)

您可以使用line [range]替换部分行,其余部分保持不变。

#!/usr/bin/ruby1.8

line = "789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423"
line[44..57] = "01191937FYY076"
p line
# => "789754654     COLORA         SOMETHING1     01191937FYY076    2342423234SS323423"

答案 1 :(得分:1)

我会:

  • 阅读
  • 中的文件
  • 像你一样分割线
  • 将数据存储在数组中(暂时)
  • 执行所有日期更改等等您想要的数组
  • 制作一个知道如何正确输出数据(带空格)的方法,将数组转换回字符串
  • 打印出该方法为您提供的内容

请查看String#ljust和/或String#rjust以了解转换方法。

答案 2 :(得分:0)

您可以使用String#sub进行简单的搜索/替换。

>> s.sub(/(\d{8}FYY\d{3})(\s*)/){ "Original: '#$1', Spaces: '#$2'" }
=> "789754654     COLORA         SOMETHING1     Original: '19370119FYY076', Spaces: '    '2342423234SS323423"

当然,在您的情况下,您输出重新格式化的日期。

>> s.sub(/(\d{8}FYY\d{3})/){ $1.reverse }
=> "789754654     COLORA         SOMETHING1     670YYF91107391    2342423234SS323423"

答案 3 :(得分:0)

使用正则表达式将线条分解为其组成部分,然后按照您需要的顺序将它们重新组合在一起。

lines = [
'789754654     COLORA         SOMETHING1     19370119FYY076    2342423234SS323423',
'742784897     COLORB        SOMETHING2      20060722FYY076    2342342342SDFSD3423'  
]

rx = Regexp.new(/^(\d{9})(\s+)(\S+)(\s+)(\S+)(\s+)(\d{4})(\d{2})(\d{2})(FYY076)(\s+)(\S+)$/)
lines.each do |line|
    match = rx.match(line)      
    puts sprintf("%s%s%s%s%s%s%s%s%s%s%s%s",
        match[1], match[2], match[3], match[4], match[5], match[6],
        match[8], match[9], match[7], match[10],match[11],match[12]  
        )
end