1

我有一个电子邮件标题数据的平面文件,我正在尝试对其进行解析以进行分析。该文件将始终具有按以下顺序排列的字段:记录号,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)位置的理解。那是对的吗?xy

由于 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 文档中找不到这个特定的答案。

4

1 回答 1

0

我最终创建了用空格替换 \t 的新输入字段。然后一切正常。关于标签字符的什么东西扔掉了仍然是一个谜。

于 2012-08-08T19:42:41.543 回答