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

Ruby 如何逐行解析文本并在数组中存储一些值,ruby,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":

我想分析以下文本并查找以
'+'
'-'
开头的行:

--- 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",
我想将
名称
存储在
减号数组

text.split(/\n/).select { |l| l =~ /^\+./ }
如果您正在使用文件:

File.open('your_file.txt', "r").select { |l| l =~ /^\+./ }
File.readlines(“File.txt”)。每行|
如果line.u以“+”开头line.u以?'-'开头
单词=行。拆分(“:”)
关键字=单词[0]。匹配(/“*”/)
val=单词[1]。匹配(/“*”/)
#然后,您可以使用此处的名称和值执行所需的操作
#例如,减_数组用于根据第一个字符进行分组:

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"]

您希望遍历这些行,并查找以
-
+
开头并后跟空格的行:

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\":"]
  • 在行尾拆分字符串,返回整行,包括尾随的行尾字符
  • lstrip
    删除行首的空白。这是为了规范化行,使正则表达式模式更简单
  • l.lstrip[/^[+-]\s/]
    是一种Ruby字符串,基本上是将模式应用于字符串并返回匹配的文本。如果字符串
    nil
    中没有匹配项,则将返回,就
    select
    而言,该值为false。如果字符串具有与模式匹配的内容,
    []
    将返回文本,该文本作为
    选择的真值,然后传递该字符串
  • map
    迭代
    select
    传递给它的所有元素,并通过在空格上拆分元素来转换元素,这是
    split
    的默认行为<代码>[1]
返回字符串中的第二个元素 这里有一条通往同一地点的备用路径:

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\":"]
ari=[]
text.lines.each do|l|
i=l.strip
ary[“\”名称“:”,“\”条形码“:”,“\”名称“:”,“\”条形码“:”]

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

看起来您正在解析
diff
结果。你可以试试这个。免责声明:我从未使用过该gem。像
--a/product.json
这样的行的属性名称是什么?当您请求代码时,您需要显示您尝试过的内容,并解释为什么它不适合您。有关如何正确提问的详细信息,请参见,尤其是第3页。@sawa,以
--
++
开头的行是要比较的原始文件和新文件。卷曲大括号内以
-
+
开头的行(
-
+
后跟空格)是重要的行。@zwippie统一的diff gem不适用于此。至少我不知道如何使用UnifiedDiff.parse函数。这是我问题的一部分。这是输出:
[“++b/product.json”、“@-1,4+1,4@”、“++“name\”:“Sinalco\”、“,”+“barcode\”:“41324134131\”]
应为第一行。我还是跳过它吧。输出中的第二行不正常。修正了:
。选择{| l | l=~/^\+./}
我想我会处理剩下的。Thnx@enter08如果您假定
+
之后有一个空格,您可以使用以下命令:
text.split(/\n/)。选择{l | l=~/^\+\s./}
@DarekNędza yes!现在输出正常了,可以了。我用这个来做两个数组。一个属性前面有-,另一个属性前面有'+''s。所以,不会有重复的。有了这些,我现在无法找到交点、并集和差分来标记文件中添加、删除和更改的行。看起来很好。只是,如何使这个字符串(文本)工作。我尝试了
@diff[0]。diff.lines.each do | line |。。。结束
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\":"]