Java中的CSV行阅读器

时间:2010-02-27 08:43:37

标签: java csv

我是基础级Java程序员。我正在使用CSV文件。我有一个包含行和列的文件,如下所示:

     col1   col2   col3
row1
row2
row3

我读取此文件并将其存储在String中。我使用换行符爆炸字符串来获取每一行。我有一个变量ArrayList,它有一些行名。我怎样才能比较它只返回特定的行?

3 个答案:

答案 0 :(得分:2)

正确解析CSV文件比初看起来更棘手,至少需要:

  • 尊重原始文字编码
  • 确保您可以导入转义分隔符,即:23,10 / 02/2010,“hello,world”,34.5
  • 根据文件区域设置
  • 应用正确的日期格式和小数点格式
  • 正确处理报价

如果这是一项快速任务,我建议使用现有的库,至少有两个用于Java的开源CSV库,其API非常相似:

  1. Java CSV Library
  2. OpenCSV
  3. 我已经尝试过从OpenCSV开始,并且因为我有一个600MB的CSV文件,因此只是逐行评估文件时抛出了OutOfMemory异常。显然当前的lib中存在内存泄漏。

    我没有时间进行调试,因此我只是切换到Java CSV,因为它具有令人惊讶的类似API的基本操作,它就像一个魅力。

    Java CSV允许您通过索引或列名访问列(如果文件中有标题)。

    <强>更新

    使用Java CSV Lib,您必须沿着这些行执行某些操作才能访问各行(quick'n'dirty,可能无法编译):

    import com.csvreader.CsvReader;
    
    class Parser {
    
        public static void main (String [] args) throws Throwable {
    
           CsvReader reader = new CsvReader("input file name.csv",
                                            ',' /* delimiter */ );
    
           while (reader.readRecord()) {
    
                // full row, you can use regex to find 
                // any rows you specifically want
                String row = reader.getRawRecord();  
    
                // get value of the first field
                String col = reader.get(0);          
    
                // gets array of fields
                String[] cols[] = reader.getValues();            
           }
    
           reader.close();
    
        }
    
    }
    

答案 1 :(得分:0)

处理此问题的最佳方法是为每一行创建一个新条目,并将这些行存储为类似Vector<Row>

的行

将每个新字符串拆分为Row对象,其中包含Row.col1,Row.col2等字段...(请选择更好的名称= P)

然后您可以迭代Vector并仅选择与您相关的那些

答案 2 :(得分:0)

首先,您最好分别阅读每一行而不是整个文件作为字符串。由于这是一个文本文件,您可以逐行阅读。谷歌的类似“Java逐行读取文件”,你会发现很多例子。

现在,在每一行中,您可以通过空格或逗号将行拆分为组件。你说它是一个CSV文件所以我常常会看到逗号,这样你就可以处理空单元格。

如果您读取第一行(列标题)并将每列的位置存储为数组的Map,则可以在每个后续行中找到适当的值。例如,您可以将每一行表示为从列名称到单元格值的映射。

我不清楚你的意思是“如何比较它只返回我特定的行?”,但听起来你想要过滤行并打印出来。在这种情况下,除了当前行之外,不需要在内存中存储任何内容,只需逐行迭代并打印,如果它通过了您想要应用的任何检查。如果您确实要存储所有行,请使用类似向量或列表的内容,但请注意,如果这是一个非常大的文件并且许多行都通过了检查,则可能没有足够的内存。