使用分词器读取一行


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]);

只需注意您的正则表达式,使用这个,您假设逗号将始终位于空格之间。

相关内容

  • 没有找到相关文章

最新更新