java - supercsv如何通过列名获取列值数组

标签 java csv supercsv

以下是 csv 文件的示例:

客户编号、名字、姓氏、出生日期、邮寄地址、已婚、 child 数量、最喜欢的报价、电子邮件、忠诚度积分

1,约翰·邓巴,1945 年 6 月 13 日,“露天剧场大道 1600 号 山景城, CA 94043 美国",,""愿原力与你同在。""- 星球大战",jdunbar@gmail.com,0
2、鲍勃·唐,1919 年 2 月 25 日,“柳树路 1601 号” 门洛帕克, CA 94025 美国",Y,0,"""坦白说,亲爱的,我一点也不在乎。""- 乱世佳人",bobdown@hotmail.com,123456

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

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

还有一个问题是,getLineNumber()方法的含义是什么?我读过文档,上面写着“获取文件中的当前位置。文件的第一行是第 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 行(通常是标题行)。

关于java - supercsv如何通过列名获取列值数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21509165/

相关文章:

java - 从 firebase android 检索数据

csv - 从 Google Cloud Bigtable 到 AWS EMR (HBase)

java - 十进制格式 "Multiple decimal separators in pattern"

java - 为什么 JAXB 不想验证

java - 使用 Maven 使用注释 @Tag ("name_test") 过滤 JUnit 5 测试用例

java - 调用动态和隐式方法

python - 使用Python编辑电子表格(通过CSV文件传递)

regex - 如何使用 linux regex 命令将行乘以范围

java - SuperCSV 的输出不可读?

java - SuperCSV 中的可选 ParseDate SuperCsvCellProcessorException 是否有解决方法?