【问题标题】:Parse file, find a string and store next values解析文件,找到一个字符串并存储下一个值
【发布时间】:2014-07-17 12:30:58
【问题描述】:

我需要根据不同的规则来解析一个文件。 该文件包含几行。 我逐行浏览文件。当我找到一个特定的字符串时,我必须存储下一行中存在的数据,直到找到一个特定的字符。

文件示例:

start {
  /* add comment */
  first_step {
     sub_first_step {
     };
     sub_second_step {
        code = 50,
        post = xxx (aaaaaa,
                    bbbbbb,
                    cccccc,
                    eeeeee),
        number = yyyy (fffffff,
                       gggggg,
                       jjjjjjj,
                       ppppppp),
     };

所以,在这种情况下:

 File.open(@file_to_convert, "r").each_line do |line|

在“行”中,我有当前行。我需要:

1) 查找该行何时包含字符串“xxx”

if line.include?("union") then 

正确吗?

2) 将下一个值(例如:aaaa、bbbb、ccccc、eeee)存储在一个数组中,直到找到字符“)”。这突出表明该部分已完成。 我想我们到达带有字符串“xxxx”的行我必须迭代块“if”中的下一行。

【问题讨论】:

  • 我不明白您为什么要使用if line.include?("union") then 来检查该行是否包含字符串"xxx"
  • 因为我对 ruby​​ 很陌生,所以这是我的第一个想法。但是任何其他方法都是受欢迎的!!!
  • 在我找到字符串“xxxx”之后,我必须存储这些值,直到找到字符“)”。我可以使用这个字符来终止迭代

标签: ruby arrays string file parsing


【解决方案1】:

试试这个:

file_contents = File.read(@file_to_convert)

lines = file_contents[/xxx \(([^)]+)\)/, 1].split
# => ["aaaaaa,", "bbbbbb,", "cccccc,", "eeeeee"]

正则表达式 (xxx \(([^)]+)\)) 获取 xxx ( 之后的所有文本,直到下一个 ),然后 split 将其拆分为多个项目。

【讨论】:

    【解决方案2】:

    它认为这就是你要找的东西:

    looking = true
    results = []
    File.open(@file_to_convert, "r").each_line do |line|
      if looking
        if line.include?("xxx")
          looking = false
          results << line.scan(/\(([^,]*)/x)
        end
      else
        if line.include?(")")
          results << line.strip.delete('),')
          break
        else
          results << line.strip.delete(',')
        end
      end
    end
    puts results
    

    【讨论】:

      猜你喜欢
      • 2014-12-09
      • 2012-10-17
      • 1970-01-01
      • 2016-04-23
      • 1970-01-01
      • 1970-01-01
      • 2018-01-01
      • 1970-01-01
      • 2023-04-06
      相关资源
      最近更新 更多