删除重复行Ruby

时间:2017-11-14 03:55:00

标签: ruby hash duplicates lines

我认为我正在处理一个json文件。但无论如何,我正在处理许多不同的哈希并获取不同的值等等。这是

{"notification_rule"=>
  {"id"=>"0000000",
   "contact_method"=>
    {"id"=>"000000",
     "address"=>"cod.lew@gmail.com",}
{"notification_rule"=>
  {"id"=>"000000"
   "contact_method"=>
      {"id"=>"PO0JGV7",
       "address"=>"cod.lew@gmail.com",}

基本的,这是我正在使用的哈希类型。用我的代码: 我想在文本文件中停止重复同样的事情。因为每当我运行此代码时,它都会带来这两个哈希的address。我理解为什么,因为它再次循环,但我认为我添加的这段代码将有助于解决这个问题:

最终更新

  if jdoc["notification_rule"]["contact_method"]["address"].to_s.include?(".com")
            numbers.print "Employee Name: "
            numbers.puts jdoc["notification_rule"]["contact_method"]["address"].gsub(/@target.com/, '').gsub(/\w+/, &:capitalize)
            file_names = ['Employee_Information.txt']
            file_names.each do |file_name|
                text = File.read(file_name)
                lines = text.split("\n")
                new_contents = lines.uniq.join("\n")
                File.open(file_name, "w") { |file| file.puts new_contents }
            end
        else 
            nil
        end

1 个答案:

答案 0 :(得分:0)

这段代码看起来很混乱,缺乏特定的目的。一般来说,这种纠结的Ruby是在错误的轨道上,就像Ruby一样,通常是一种表达简单的简单方法,并且测试重复的地址是不应该做的事情之一。硬。

最大的混淆之一是一大块代码的责任。在该示例中,您不仅要尝试导入数据,循环文档,清理电子邮件地址以及测试重复项,还要以某种方式帮助打印出结果。这是很多事情同时发生的事情,他们都必须完美地工作才能完全运行这一大块代码。没有办法让它部分工作,也无法知道你是否在正确的轨道上。

始终尝试将复杂问题分解为几个简单的阶段,然后根据需要将这些阶段链接在一起。

以下是如何定义清理电子邮件地址的方法:

def address_scrub(address)
  address.gsub(/\@target.com/, '').gsub(/\w+/, &:capitalize)
end

可以根据需要对其进行调整,并且可能测试以确保其正常工作,您现在可以独立于其他代码进行操作。

至于其余的,它看起来像这样:

require 'set'

# Read in duplicated addresses from a file, clean up with chomp, using a Set
# for fast lookups.
duplicates = Set.new(
  File.open("Employee_Information.txt", "r").readlines.map(&:chomp)
)

# Extract addresses from jdoc document array
filtered = jdocs.map do |jdoc|
  # Convert to jdoc/address pair
  [ jdoc, address_scrub(jdoc["notification_rule"]["contact_method"]["address"]) ]
end.reject do |jdoc, address|
  # Remove any that are already in the duplicates list
  duplicates.include?(address)
end.map do |jdoc, _|
  # Return only the document
  jdoc
end

在哪里处理jdocsjdoc结构数组,并通过一系列简单步骤删除重复项。

使用链接方法,您可以在添加下一个"链接"之前看到发生了什么,这样您就可以逐步实现解决方案,随时调整。任何错误都很容易被捕获,因为您可以随时检查这些阶段的中间产品。