在Ruby中解析外部文件中的文本行

在Ruby中解析外部文件中的文本行,ruby,string,parsing,Ruby,String,Parsing,我正在尝试解析一封原始电子邮件。所需的结果是包含特定标题的行的散列 这是Ruby文件: raw_email = File.open("sample-email.txt", "r") parsed_email = Hash.new('') raw_email.each do |line| puts line header = line.chomp(":") puts header if header == "Delivered-To" parsed_email[:to]

我正在尝试解析一封原始电子邮件。所需的结果是包含特定标题的行的散列

这是Ruby文件:

raw_email = File.open("sample-email.txt", "r")
parsed_email = Hash.new('')

raw_email.each do |line|
  puts line
  header = line.chomp(":")
  puts header
  if header == "Delivered-To"
    parsed_email[:to] = line
  elsif header == "From"
    parsed_email[:from] = line
  elsif header == "Date"
    parsed_email[:date] = line
  elsif header == "Subject"
    parsed_email[:subject] = line
  end
end

puts parsed_email
这是原始电子邮件:

Delivered-To: user1@example.com
From: John Doe <user2@example.com>
Date: Tue, 12 Dec 2017 13:30:14 -0500
Subject: Testing the parser
To: user1@example.com
Content-Type: multipart/alternative; 
boundary="123456789abcdefghijklmnopqrs"

--123456789abcdefghijklmnopqrs
Content-Type: text/plain; charset="UTF-8"

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Integer nec 
odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla 
quis sem at nibh elementum imperdiet. Duis sagittis ipsum.

--123456789abcdefghijklmnopqrs
Content-Type: text/html; charset="UTF-8"

<div dir="ltr">Lorem ipsum dolor sit amet, consectetur adipiscing 
elit. Integer nec odio. Praesent libero. Sed cursus ante dapibus diam. 
Sed nisi. Nulla quis sem at nibh elementum imperdiet. Duis sagittis 
ipsum.<br clear="all">
</div>

--089e082c24dc944a9f056028d791--
puts语句仅用于我自己的测试,以查看是否正在传递数据

我得到的是每一整行放两次,最后放一个空哈希

我还尝试将不同的位更改为字符串或数组,并尝试使用line.split:,1而不是line.chomp:

有人能解释一下为什么这不起作用吗?

试试这个

raw_email = File.open("sample-email.txt", "r")
parsed_email = {}

raw_email.each do |line|
  case line.split(":")[0]
  when "Delivered-To"
    parsed_email[:to] = line
  when "From"
    parsed_email[:from] = line
  when "Date"
    parsed_email[:date] = line
  when "Subject"
    parsed_email[:subject] = line
  end
end

puts parsed_email
=> {:to=>"Delivered-To: user1@example.com\n", :from=>"From: John Doe <user2@example.com>\n", :date=>"Date: Tue, 12 Dec 2017 13:30:14 -0500\n", :subject=>"Subject: Testing the parser\n"}
解释
您需要在:上拆分线,然后选择第一个。与此行类似。拆分:[0]

Chomp删除尾随字符默认为换行符。你两个都要:line.chomp.split:我明白了。我的印象是chomp会在最后一次找到字符串中提供的或默认的分隔符时拆分,然后在包含分隔符后删除所有内容。顺便说一句,对于折叠的标题正文,您当前的方法完全失败了。当然。我最初完全是这样尝试的,但是忘记了split返回一个数组,所以我省略了[0]。这让我陷入了一个混乱的兔子洞。非常感谢你。这正是我想要做的。尽管如此,我建议使用邮件解析gem,而不要自己做。哈哈。我完全同意。通常我会,但我正在努力学习邮件解析的工作原理;另外:扫描应在标记头枕末端的第一个空行后停止。这样可以避免扫描整个主体,包括任何附件,这些附件可能很大,或者主体甚至可能包含匹配字段,从而产生错误的结果。