我有一个电子邮件标题数据的平面文件,我正在尝试解析以进行分析。该文件将始终按顺序包含以下字段:记录号,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));
在这种情况下,我抓住“From:”后面的所有内容(第六个字节排除冒号后的单词,冒号和空格/单字节),通过一个LESS而不是“Sent:”的位置( 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会给我一个索引值,该值在行前面的索引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文档中找不到这个具体的答案。
答案 0 :(得分:0)
我最终创建了用空格替换\ t的新输入字段。一切都很好。什么是关于投掷东西的标签字符仍然是一个谜。