supercsv如何按列名获取列值数组

时间:2014-02-02 09:51:17

标签: java csv supercsv

以下是csv文件的示例:

customerNo,名字,姓氏,出生日期,mailingAddress,已婚,numberOfKids,favouriteQuote,电子邮件,loyaltyPoints

1,John,Dunbar,13/06/1945,“1600 Amphitheatre Parkway Mountain View,CA 94043 美国“,,,”“”愿部队与你同在。“” - 星球大战“,jdunbar @ gmail.com,0
2,Bob,Down,25/02/1919,“1601 Willow Rd。 Menlo Park,CA 94025 美国“,Y,0,”“坦率地说,我亲爱的,我不会诅咒。”“ - 飘”,bobdown @ hotmail.com,123456

例如,如何获取属于lastName的所有列值?
我希望结果应该是[Dunbar,Down]。

我试图搜索文档,但找不到任何有用的例子。

还有一个问题是,getLineNumber()方法的含义是什么?我已经阅读了文档,它说“获取文件中的当前位置。文件的第一行是第1行。”但我仍然感到困惑。

2 个答案:

答案 0 :(得分:1)

您有很多选择。我使用过CsvListReader,但您可以轻松地使用CsvMapReader或CsvBeanReader。

您可以使用Collector单元格处理器:

private static final String CSV = "firstName,lastName\nJohn,Dunbar\nBob,Down";

@Test
public final void testCollector() throws IOException {
    ICsvListReader reader = new CsvListReader(new StringReader(CSV), 
        CsvPreference.STANDARD_PREFERENCE);
    reader.getHeader(true); // skip header

    // Collector processor 'collects' values from a column
    List<Object> firstNames = new ArrayList<Object>();
    CellProcessor[] processors = {new Collector(firstNames), null};

    while(reader.read(processors) != null){
        // just keep reading - Collector will collect the values
    }

    // prints: [John, Bob]
    System.out.println(firstNames);
}

或者在Super CSV读取每一行后抓取相关列:

@Test
public final void testManual() throws IOException {
    ICsvListReader reader = new CsvListReader(new StringReader(CSV), 
        CsvPreference.STANDARD_PREFERENCE);
    reader.getHeader(true); // skip header

    List<String> firstNames = new ArrayList<String>();

    List<String> line;
    while((line = reader.read()) != null){
        firstNames.add(line.get(0));
    }

    // prints: [John, Bob]
    System.out.println(firstNames);
}

无论哪种方式,您都需要阅读整个文件 - CSV不是电子表格,您不能轻易地获取特定列中的所有值(记录可以跨越1行!)。这让我想到你的下一个问题...

直接来自javadoc:

getLineNumber():获取文件中的当前位置。该文件的第一行是第1行。

getRowNumber():获取当前行号(即已读取的CSV记录数 - 包括标题)。这与lineNumber不同,lineNumber是文件中已读取的实际行数。第一行是第1行(通常是标题行)。

答案 1 :(得分:0)

如果您可以读取csv的每一行,例如readline,只需拆分字符串并阅读第2列。

String[] csvLine = getLine().split(",");  
String lastName = csvLine[2];