【问题标题】:read csv file with java - comma delimiter in text field使用 java 读取 csv 文件 - 文本字段中的逗号分隔符
【发布时间】:2011-11-07 09:42:35
【问题描述】:

我有一个逗号分隔的 CSV 文件,其中包含 NASDAQ 符号。我使用 Scanner 读取文件

  s = new Scanner(new File("C:\\nasdaq_companylist.csv")).useDelimiter("\\s*,\\s*");    

我在第二个字段上遇到异常。问题是该字段与文件中的其他一些字段一样也包含逗号,例如“1-800 FLOWERS.COM, Inc.”:

FLWS,"1-800 FLOWERS.COM, Inc.",2.8,76022800,n/a,1999,Consumer Services,Other Specialty Stores,http://www.nasdaq.com/symbol/flws    

如何避免这个问题? 我的代码是:

List<Stock> theList = new ArrayList<Stock>();
    StringBuilder sb = new StringBuilder();

    //get the title
    String title = s.nextLine();
    System.out.println("title: "+title);

    while (s.hasNext()) 
    {

        String symbol = s.next();
        String name = s.next();
        double lastSale = s.nextDouble();           
        long marketCap = s.nextLong();
        String adr =s.next();
        String ipoYear=s.next();
        String sector=s.next();
        String industry = s.next();
        String summaryQuote = s.next();
        theList.add(newStock(symbol,lastSale));} 

谢谢

【问题讨论】:

标签: java csv


【解决方案1】:

除非这是家庭作业,否则您不应自己解析 CSV。使用现有库之一。比如这个:http://commons.apache.org/sandbox/csv/

或谷歌“java csv parser”并选择另一个。

但如果你想自己实现逻辑,你应该使用正则表达式的负前瞻功能(参见http://download.oracle.com/javase/1,5.0/docs/api/java/util/regex/Pattern.html

【讨论】:

  • 感谢 Alex,我找到了一些用于解析 CSV 文件的库。最后我使用了 opencsv
【解决方案2】:

您最安全的选择是使用 csv 解析库。您的逗号用引号括起来。您需要实现逻辑来查找带引号的逗号。但是,您还需要计划其他情况,例如引用中的引用、转义序列等。最好使用一些现成的和经过测试的解决方案。用谷歌,你会找到一些。单独使用 CSV 文件可能会很棘手。

【讨论】:

    【解决方案3】:

    正如其他人正确指出的那样,滚动您自己的 csv 解析器并不是一个好主意,因为它通常会在您的系统中留下巨大的安全漏洞。

    也就是说,我使用这个正则表达式:

    "((?:\"[^\"]*?\")*|[^\"][^,]*?)([,]|$)"
    

    在格式良好的 csv 数据方面做得很好。您将需要使用PatternMatcher

    这就是它的作用:

    /*
     ( - Field Group
       (?: - Non-capturing (because the outer group will do the capturing) consume of quoted strings
        \"  - Start with a quote
        [^\"]*? - Non-greedy match on anything that is not a quote
        \" - End with a quote
       )* - And repeat
      | - Or
       [^\"] - Not starting with a quote
       [^,]*? - Non-greedy match on anything that is not a comma
     ) - End field group
     ( - Separator group
      [,]|$ - Comma separator or end of line
     ) - End separator group 
    */
    

    请注意,它将数据解析为两组,字段和分隔符。它还会在字段中留下引号字符,您可能希望删除它们并将“”替换为“等。

    【讨论】:

    • Paul,感谢您分享正则表达式。自从看到您的回答后,我开始研究自己的正则表达式。
    【解决方案4】:

    我希望你可以从你的正则表达式中删除 \ \ s *。然后有:

    while (s.hasNext() {
        String symbol = s.next();
        if (symbol.startsWith("\"")) {
            while ((symbol.endsWith("\"") || symbol.length() == 1) && s.hasNext()) {
                symbol += "," + s.next();
            }
        }
    ...
    

    【讨论】:

    • 谢谢乔普的精彩分享
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-16
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多