如何逐行解析文本并将某些值存储在数组中

时间:2014-06-17 13:57:44

标签: ruby

我想解析以下文字,找到以'+''-'开头的行:

--- a/product.json
+++ b/product.json
@@ -1,4 +1,4 @@
 {
-  "name": "Coca Cola",
-  "barcode": "41324134132"
+  "name": "Sprite",
+  "barcode": "41324134131"
 }
\ No newline at end of file

当我找到这样的行时,我想存储属性名称。即,为:

-  "name": "Coca Cola",

我想将name存储在minus_array

4 个答案:

答案 0 :(得分:2)

您希望迭代这些行,并找到以-+开头的行,后跟空格:

text = %[
--- a/product.json
+++ b/product.json
@@ -1,4 +1,4 @@
 {
-  "name": "Coca Cola",
-  "barcode": "41324134132"
+  "name": "Sprite",
+  "barcode": "41324134131"
 }
\ No newline at end of file
]

text.lines.select{ |l| l.lstrip[/^[+-]\s/] }.map{ |s| s.split[1] }
# => ["\"name\":", "\"barcode\":", "\"name\":", "\"barcode\":"]
  • lines在行尾分割一个字符串,返回整行,包括尾随的行尾字符。
  • lstrip删除该行开头的空格。这是为了规范化线条,使正则表达式更加简单。
  • l.lstrip[/^[+-]\s/]是一点Ruby String,基本上就是将模式应用于字符串并返回匹配的文本。如果字符串nil中没有任何匹配项将被返回,就select而言,它将作为假。如果字符串具有与模式匹配的内容,[]将返回文本,该文本充当select的真值,然后传递该字符串。
  • map遍历select传递给它的所有元素,并通过在空格上拆分来转换元素,这是split的默认行为。 [1]会返回字符串中的 second 元素。

这是通往同一地方的另一条路径:

ary = []
text.lines.each do |l|
  i = l.strip
  ary << i if i[/^\{$/] .. i[/^}$/]
end
ary[1..-2].map{ |s| s.split[1] } # => ["\"name\":", "\"barcode\":", "\"name\":", "\"barcode\":"]

那会让你开始。如何删除重复项,删除前导/尾随双引号和冒号是你的任务。

答案 1 :(得分:0)

text.split(/\n/).select { |l| l =~ /^\+./ }

如果您正在使用文件:

File.open('your_file.txt', "r").select { |l| l =~ /^\+./ }

答案 2 :(得分:0)

File.readlines("file.txt").each do |line|
    if line.starts_with? '+ ' || line.starts_with? '- '
        words = line.split(":")
        key = words[0].match(/".*"/)
        val = words[1].match(/".*"/)
        # You can then do what you will with the name and value here
        # For example, minus_array << if line.starts_with? '-'
    end
end

我不完全确定您对此有何限制,因此我无法给出更具体的答案。基本上,您可以使用File.readlines('file') { }迭代文件的行。然后我们检查要以+-开头的字符串,并相应地获取名称和值。我在starts_with?中添加了一个空格,因为如果我没有,那么它也会匹配您示例中的前两行。

希望这就是你要找的东西!

答案 3 :(得分:0)

使用group_by根据第一个字符进行分组:

groups = text.lines.group_by { |l| l[0] }

groups['-']
# => ["--- a/product.json\n", "-  \"name\": \"Coca Cola\",\n", "-  \"barcode\": \"41324134132\"\n"]
groups['+']
# => ["+++ b/product.json\n", "+  \"name\": \"Sprite\",\n", "+  \"barcode\": \"41324134131\"\n"]