通过分隔符分隔电子邮件字符串

时间:2016-06-13 06:04:06

标签: ruby email

我有一系列电子邮件地址(大约超过50,000),我有兴趣计算特定电子邮件域的频率。例如,如果我有

emails = [
  'Johndoe@gmail.com',
  'Johndoe@yahoo.com', 
  'Johndoe@aol.com',
  'Johndoe@someuni.xyz.com',
  'Janedoe@gmail.com'
]

我对哪个电子邮件域名出现最感兴趣,我希望以频率'gmail'返回2

要做到这一点,我认为最好通过数组并丢弃@之前发生的所有事情,并将域保持为新数组,然后我可以迭代。我该怎么做?

4 个答案:

答案 0 :(得分:5)

假设您的电子邮件是string,您可以执行以下操作:

emails = ["Johndoe@gmail.com", "Johndoe@yahoo.com", "Johndoe@aol.com", "Johndoe@someuni.xyz.com", "Janedoe@gmail.com"]
counts = Hash.new(0)
emails.each { |t| counts[t.partition("@").last] += 1}
counts #{"gmail.com"=>2, "yahoo.com"=>1, "aol.com"=>1, "someuni.xyz.com"=>1} 

答案 1 :(得分:3)

类似于mudasobwa的回答。

emails
.group_by{|s| s.partition("@").last}
.map{|k, v| [k, v.length]}
.max_by(&:last)
# => ["gmail.com", 2]

答案 2 :(得分:2)

emails.map { |e| e.split('@').last } # leave domains
      .group_by { |s| s }            # group
      .map { |k, v| [k, v.count] }   # count
      .sort_by(&:last)               # sort
      .last                          # get results
#⇒ ["gmail.com", 2]

答案 3 :(得分:2)

  

我认为将域保持为新数组是个好主意,然后我可以迭代。我该怎么做?

您应该使用适当的库来解析电子邮件地址,例如Mail gem。它附带了一个实用程序类Mail::Address,可以轻松访问地址字段:

require 'mail'

emails = %w[
  Johndoe@gmail.com
  Johndoe@yahoo.com
  Johndoe@aol.com
  Johndoe@someuni.xyz.com
  Janedoe@gmail.com
]

domains = emails.map { |email| Mail::Address.new(email).domain }
#=> ["gmail.com", "yahoo.com", "aol.com", "someuni.xyz.com", "gmail.com"]

它还可以处理更复杂的地址格式。来自documentation

a = Address.new('Mikel Lindsaar (My email address) <mikel@test.lindsaar.net>')
a.format       #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'
a.address      #=> 'mikel@test.lindsaar.net'
a.display_name #=> 'Mikel Lindsaar'
a.local        #=> 'mikel'
a.domain       #=> 'test.lindsaar.net'
a.comments     #=> ['My email address']
a.to_s         #=> 'Mikel Lindsaar <mikel@test.lindsaar.net> (My email address)'