两个分隔符之间的分块文件行

时间:2016-03-17 18:17:50

标签: ruby alphabetical

我是ruby的新手(有点),我正在试图弄清楚如何将文件的某些部分(行)组合在一起,这样我以后可以按字母顺序排列每个块的第一行。我一直无法找到这个。

我发现了文件I / O以及将大文件上传到内存的问题,但这不是问题,因为我的文件静态~70kB。

我要求的是如何在两个不同的分隔符之间将文件的行组合在一起,并排除文件中不符合条件的所有其他内容。

file.txt =

//RandomComment
someObject:{
 someKey:someValue
},

//Another Random Comment
someOtherObject:{
 someKey:someValue
}

并决心

someObject:{
  someKey:someValue      //chunk 1
},
someOtherObject:{
 someKey:someValue       //chunk 2
}

在这种情况下,我的分隔符将是该行包含“{”以及该行与包含“}”的后续行之间的所有内容

到目前为止,这是我的红宝石:

require 'active_support'
require 'active_support/core_ext'

if File.exist?(filePath)
     File.open(filePath,"r") do |f|
      f.chunk { |line|
        line.include? "{" || "}"
      }.each { |_, lines|
        puts lines
      }
     end
    end

感谢您对此感谢的任何帮助

2 个答案:

答案 0 :(得分:0)

NB Disclamer :永远不要使用正则表达式来解析长文本输入。

▶ input = '//RandomComment
▷ someObject:{
▷  someKey:someValue
▷ },
▷
▷ //Another Random Comment
▷ someOtherObject:{
▷  someKey:someValue
▷ }'
▶ input.scan /^[^\r\n]*{[^}]*[^\r\n]*/

#⇒ [
#    "someObject:{\n  someKey:someValue\n},",
#    "someOtherObject:{\n someKey:someValue\n}"
# ]

答案 1 :(得分:0)

如果text是您的字符串:

puts text.split.select { |line|
  line.include?("{")..line.include?("}") ? true : false }.join("\n")

someObject:{
someKey:someValue
},
someOtherObject:{
someKey:someValue
}

如果你只想要

["someKey:someValue\n", "someKey:someValue\n"]

返回,插入

.reject { |e| e =~ /\{|\}/ }
.join之前

这使用Ruby的"flip-flop"运算符。

线条被拒绝,直到找到包含左括号的线条。为该行返回true,并且随后每次都返回true,直到找到包含右括号的行。为右支撑线返回false,然后返回(e==1..e==2) ? true : false,直到找到包含左括号的另一条线,依此类推。因此,名称"触发器"。

似乎(e==1..e==2)可以简化为var sports = document.getElementById('sports'); console.log(sports.childNodes); ,但事实并非如此,因为后一种表达被视为正常范围。人字拖必须有条件形式。