我有一个样本位置文件,如下所示。
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
有人可以建议更好的策略,以便在原始文件中的定位保持不变吗?
答案 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