【问题标题】:parsing position files in ruby在 ruby​​ 中解析位置文件
【发布时间】:2010-06-01 14:15:57
【问题描述】:

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

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

谁能提出一个更好的策略,使原始文件中的定位保持不变?

【问题讨论】:

  • 在示例字符串中,日期字段似乎跨越第 45 到 58 列而不是 54 到 61 列。
  • 我故意缩短它以使其更易于阅读。

标签: ruby parsing


【解决方案1】:

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

#!/usr/bin/ruby1.8

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

【讨论】:

    【解决方案2】:

    我愿意:

    • 读取文件
    • 像你一样分割线
    • 将数据存储在数组中(临时)
    • 对该数组进行所有日期更改等操作
    • 创建一个知道如何正确输出数据(带空格)的方法,以将数组转回字符串
    • 打印出该方法为您提供了什么

    看看String#ljust和/或String#rjust的转换方法。

    【讨论】:

      【解决方案3】:

      您可以使用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"
      

      【讨论】:

        【解决方案4】:

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

        行 = [ '789754654 COLORA Something1 19370119FYY076 2342423234SS323423', '742784897 颜色 20060722FYY076 2342342342SDFSD3423' ] rx = Regexp.new(/^(\d{9})(\s+)(\S+)(\s+)(\S+)(\s+)(\d{4})(\d{2})( \d{2})(FYY076)(\s+)(\S+)$/) lines.each 做 |line| 匹配 = rx.match(行) puts sprintf("%s%s%s%s%s%s%s%s%s%s%s%s", 比赛[1],比赛[2],比赛[3],比赛[4],比赛[5],比赛[6], 比赛[8],比赛[9],比赛[7],比赛[10],比赛[11],比赛[12] ) 结尾

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-22
          • 1970-01-01
          • 1970-01-01
          • 2012-07-30
          • 1970-01-01
          • 2011-02-28
          • 2013-04-28
          相关资源
          最近更新 更多