【发布时间】:2014-05-23 19:41:25
【问题描述】:
我有一个电子邮件标题数据的平面文件,我正在尝试对其进行解析以进行分析。该文件将始终具有按如下顺序排列的字段:记录号,1 或 2 个字节,"From:" 后跟发件人姓名,"Sent:" 后跟发送日期。
1 From: Person.Name Sent: April 12, 2010
2 From:<tab>Person.Name Sent: April 30, 2011
10 From: Person.Name Sent: June 29, 2012
11 From:<tab>Person.Name Sent: July 8, 2012
使用BufferedReader 我正在逐行读取文件并根据"From:" 和"Sent:" 的索引之间的所有字符定义名称的子字符串。
String sender = inputLine.substring((inputLine.indexof("From:")+6),(inputLine.indexOf("Sent:")-1));
在这种情况下,我通过比“发送:”(第S 前的空格)。
但是,我在运行作业时得到了意外的输出。我的一些输入数据似乎在"From: " 之后有一个标签,而有些行没有。当存在一个选项卡时,我的输出包括最后两个或 @987654329 @的三个字节(当记录号为单位时,我得到 @987654330 @,对于双数字记录号,它是 @9877654331 @。
Person.Name
m:<tab>Person.Name <-- single digit record number
Person.Name
om:<tab>Person.Name <-- double digit record number
编辑:当我将 substring 修改为
String sender = inputLine.substring((inputLine.indexof("From:\t")+6),(inputLine.indexOf("Sent:")-1));
只有带有空格(而不是制表符)的记录将 From: 的末尾添加到输出中。
Person.Name <-- records with From:<tab>
om: Person.Name <-- records with From:<space>
我现在想知道我是否正确理解了substring。我上面的陈述是基于对substring(x,y) 的理解,其中x 是字符串的开头,y 是字符串的结尾。对吗?
由于 indexOf("From:") 旨在表示 2 或 3 的整数值(取决于 1 或 2 字节的记录号,例如,1 From: 或 10 From:)我认为添加一个值6 会给我一个索引值,该索引值位于行前索引 8 或 9 中的 : 之后。那么,为什么它似乎将其视为 5 的索引——不管怎样?
111111111122222222222 |
0123456789012345678901234567890 + index values
1 From: Person.Name Sent: June
10 From: Person.Name Sent: July
制表符是记录中的唯一区别,虽然我知道制表符字符的计数可能与 ASCII 空格字符不同,但从索引中减去似乎有点奇怪。
更有趣的是,如果我从语句中删除“调整”,
String sender = inputLine.substring((inputLine.indexof("From:")),(inputLine.indexOf("Sent:")));
我得到一个-1 out of range 异常。
有人可以解释一下这里发生了什么吗?我很困惑,在 oracle 的 java 文档中找不到这个特定的答案。
【问题讨论】:
-
可以考虑追加 From:\\t 看看。
-
\\t是带有转义字符的制表符吗?然后我会做indexOf("From:\\t")吗? -
是的。我会试一试。但是,没有制表符的行会失败。
-
根据您提供的信息,您原来的
substring没问题。 (顺便说一句,您不需要那些围绕您的论点的括号,它们使阅读代码变得困难。)我遇到了麻烦(尊重!)相信您所描述的;在From:之后 存在标签无法 更改indexOf("From:")的结果,因此无法 更改字符串中的起点substring将在其中提取子字符串。 -
在我查找
\\t时进行了修订以包含更多意外结果