public void GrabData() throws IOException
{
try {
BufferedReader br = new BufferedReader(new FileReader("data/500.txt"));
String line = "";
int lineCounter = 0;
int TokenCounter = 1;
arrayList = new ArrayList < String > ();
while ((line = br.readLine()) != null) {
//lineCounter++;
StringTokenizer tk = new StringTokenizer(line, ",");
System.out.println(line);
while (tk.hasMoreTokens()) {
arrayList.add(tk.nextToken());
System.out.println("check");
TokenCounter++;
if (TokenCounter > 12) {
er = new DataRecord(arrayList);
DR.add(er);
arrayList.clear();
System.out.println("check2");
TokenCounter = 1;
}
}
}
} catch (FileNotFoundException ex) {
Logger.getLogger(Driver.class.getName()).log(Level.SEVERE, null, ex);
}
}
您好,我正在使用分词器来读取一行的内容并将其存储到araylist中。在这里,GrabData 类完成了这项工作。
唯一的问题是公司名称(每行的第三列)用引号引起来,里面有一个逗号。我为您的示例提供了一行。分词器依赖于逗号将行分隔为不同的标记。但我想公司名称会把它扔掉。如果不是公司列中的逗号,一切正常。
例:-Essie,Vaill,"Litronic,Industries",14225 Hancock Dr,Anchorage,Anchorage,AK,99515,907-345-0962,907-345-1215,essie@vaill.com,http://www.essievaill.com
有什么想法吗?
首先,StringTokenizer被认为是遗留代码。从Java文档:
StringTokenizer 是一个遗留类,出于兼容性原因而保留,但不鼓励在新代码中使用它。建议任何寻求此功能的人都使用 String 的拆分方法或 java.util.regex 包。
使用 split() 方法,您可以获得一个字符串数组。在遍历数组时,您可以检查当前字符串是否以引号开头,如果是这种情况,请检查下一个字符串是否以引号结尾。如果您满足这两个条件,那么您就知道您没有在您想要的地方拆分,您可以将这 2 个合并在一起,根据需要进行处理,然后继续正常迭代数组。在该传递中,您可能会执行 i+=2 而不是常规的 i++,并且应该不会被注意到。
正则表达式完成此操作。以下代码:
String s = "asd,asdasd,asd"asdasdasd,asdasdasd", asdasd, asd";
System.out.println(s);
s = s.replaceAll("(?<=")([^"]+?),([^"]+?)(?=")", "$1 $2");
s = s.replaceAll(""", "");
System.out.println(s);
收益 率
asd,asdasd,asd, "asdasdasd,asdasdasd", asdasd, asd
asd,asdasd,asd, asdasdasd asdasdasd, asdasd, asd
据我了解,这是您的分词器代码工作所需的预处理。希望这有帮助。
虽然 StringTokenizer 可能不会原生地为您处理这个问题,但几行代码就可以做到...... 可能不是最有效的,但应该把这个想法传达出去......
while(tk.hasMoreTokens()) {
String token = tk.nextToken();
/* If the item is encapsulated in quotes, loop through all tokens to
* find closing quote
*/
if( token.startsWIth(""") ){
while( tk.hasMoreTokens() && ! tk.endsWith(""") ) {
// append our token with the next one. Don't forget to retain commas!
token += "," + tk.nextToken();
}
if( !token.endsWith(""") ) {
// open quote found but no close quote. Error out.
throw new BadFormatException("Incomplete string:" + token);
}
// remove leading and trailing quotes
token = token.subString(1, token.length()-1);
}
}
如您所见,在类描述中,Oracle 不鼓励使用 StringTokenizer。而不是使用分词器,我会使用 String split() 方法您可以使用正则表达式作为参数并显着减少代码。
String str = "Essie,Vaill,"Litronic , Industries",14225 Hancock Dr,Anchorage,Anchorage,AK,99515,907-345-0962,907-345-1215,essie@vaill.com,http://www.essievaill.com";
String[] strs = str.split("(?<! ),(?! )");
List<String> list = new ArrayList<String>(strs.length);
for(int i = 0; i < strs.length; i++) list.add(strs[i]);
只需注意您的正则表达式,使用这个,您假设逗号将始终位于空格之间。