我有一个电子邮件标题数据的平面文件,我正在尝试对其进行解析以进行分析。该文件将始终具有按以下顺序排列的字段:记录号,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: "
而有些行没有。当一个选项卡存在时,我的输出包括最后两个或三个字节"From: "
(当记录号是一位数时,我得到m:<tab>
,对于两位数的记录号,它是om:<tab>
.
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 的值会给我一个索引值落在:
行前的 in 索引 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 文档中找不到这个特定的答案。