簡體   English   中英

在ruby中解析位置文件

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM