【问题标题】:Parsing lines of text from external file in Ruby在 Ruby 中从外部文件中解析文本行
【发布时间】:2017-12-13 13:08:23
【问题描述】:

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

这是 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(":")

有人可以解释为什么这不起作用吗?

【问题讨论】:

  • Chomp 删除 尾随 字符(默认为换行符)。你想要两个:line.chomp.split(":")
  • 我明白了。我的印象是 chomp 会在字符串中最后找到的提供(或默认)分隔符处“拆分”,然后删除之后的所有内容(包括分隔符)。
  • 顺便说一句,对于折叠的标题正文,您当前的方法完全失效。

标签: ruby string parsing


【解决方案1】:

试试这个

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"}

说明 您需要在: 上拆分行并首先选择。赞这个line.split(":")[0]

【讨论】:

  • 当然。我最初尝试完全一样,但忘记了 split 返回一个数组,所以我放弃了[0]。这让我陷入了混乱的兔子洞。非常感谢。这正是我想要做的。
  • 话虽如此,我建议使用邮件解析 gem 而不是自己做。
  • 哈哈。我完全同意。通常我会,但是,我正在尝试了解邮件解析的工作原理。 ;)
  • 另外:扫描应该在第一个空行之后停止(这标志着 headerblock 的结束)。这样可以避免扫描可能很大的整个正文(包括任何附件),或者正文甚至可能包含会产生错误结果的匹配字段。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-04-02
  • 1970-01-01
  • 2014-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-26
  • 1970-01-01
相关资源
最近更新 更多