0

我正在尝试使用 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,并将它们与该短语的关联标记一起输出,如上所述。

任何人都可以帮忙吗?

4

1 回答 1

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
于 2013-01-31T11:09:49.660 回答