我正在尝试使用Ruby来“标记”CSV表中的记录,具体取决于特定字段是否包含重复的某个短语。我不确定是否有图书馆可以帮助完成这类工作,我认识到Ruby可能不是最有效的语言来做这类事情。
我的CSV表包含我要搜索的唯一ID和文本字段:
ID,NOTES
1,MISSING DOB; ID CANNOT BE BLANK
2,INVALID MEMBER ID - unable to verify
3,needs follow-up
4,ID CANNOT BE BLANK-- additional info needed
在此CSV表格中,我提取了关键字并为其分配了一个标记,我已将其存储在另一个CSV表格中。
PHRASE,TAG
MISSING DOB,BLANKDOB
ID CANNOT BE BLANK,BLANKID
INVALID MEMBER ID,INVALIDID
请注意,除了我已识别并想要映射的短语之外,我的源中的NOTES列还包含标点符号和其他短语。此外,并非所有记录都有匹配的短语。
我想创建一个看起来像这样的表:
ID, TAG
1, BLANKDOB
1, BLANKID
2, INVALIDID
4, BLANKID
或者,用另一个字符分隔的标签:
ID, TAG
1, BLANKDOB; BLANKID
2, INVALIDID
4, BLANKID
我已将映射表加载到哈希中,并将短语作为键。
phrase_hash = {}
CSV.foreach("phrase_lookup.csv") do |row|
phrase, tag = row
next if name == "PHRASE"
phrase_hash[phrase] = tag
end
哈希的键是我想要迭代的搜索短语。我在Ruby中表达我想做的事情时遇到了麻烦,但这就是我的想法:
将NOTES表加载到数组中。对于每个短语(即键),从数组中选择包含短语的记录,收集与这些行关联的ID,并使用该短语的关联标记输出它们,如上所述。
有人可以帮忙吗?
答案 0 :(得分:0)
我将举例说明使用哈希输入而不是CSV:
notes = { 1 => "MISSING DOB; ID CANNOT BE BLANK",
2 => "INVALID MEMBER ID - unable to verify",
3 => "needs follow-up",
4 => "ID CANNOT BE BLANK-- additional info needed"
}
tags = { "MISSING DOB" => "BLANKDOB",
"ID CANNOT BE BLANK" => "BLANKID",
"INVALID MEMBER ID" => "INVALIDID"
}
output = {}
tags.each_pair do |tags_key,tags_value|
notes.each_pair do |notes_key, notes_value|
if notes_value.match(tags_key)
output[notes_key] ||= []
output[notes_key] << tags_value
end
end
end
puts output.map {|k,v| "#{k}, #{v.join("; ")}"}.sort