[英]parsing position files in ruby
我有一個示例位置文件,如下所示。
789754654 COLORA SOMETHING1 19370119FYY076 2342423234SS323423
742784897 COLORB SOMETHING2 20060722FYY076 2342342342SDFSD3423
我對職位54-61(第四欄)感興趣。 我想將日期更改為其他格式。 因此最終結果將是:
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
誰能建議一個更好的策略,以使原始文件中的位置保持不變?
您可以使用line [range]替換部分行,其余部分保持不變。
#!/usr/bin/ruby1.8
line = "789754654 COLORA SOMETHING1 19370119FYY076 2342423234SS323423"
line[44..57] = "01191937FYY076"
p line
# => "789754654 COLORA SOMETHING1 01191937FYY076 2342423234SS323423"
我會:
看一下String#ljust
和/或String#rjust
進行轉換的方法。
您可以使用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"
使用正則表達式將行分成其組成部分,然后按所需順序將它們放回原處。
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.