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