以下是 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/