我是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
感谢您对此感谢的任何帮助
答案 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);
,但事实并非如此,因为后一种表达被视为正常范围。人字拖必须有条件形式。