我正在使用Super CSV,它看起来像一个惊人的包。
我唯一担心的是如何使用名称中包含空格的列。不,我不能回去自己删除空格。这些文件将由数百个提供给我,我没有时间返回并修复每个文件的所有60列,我不能相信其他人正确地做到这一点。
如何使用标题中带空格的列(即“名字”而不是“FirstName”或“firstName”)?
谢谢!
有关编码样本,请查看此处:http://supercsv.sourceforge.net/codeExamples_general.html
答案 0 :(得分:5)
您注意到链接到的示例中的这一行:
final String[] header = inFile.getCSVHeader(true);
这应该为您提供列名,不是吗?
http://supercsv.sourceforge.net/javadoc/index.html
我想我现在明白你的问题。传递给read
函数的String []参数获取要读入的类的属性名称。它是位置的,因此它不必像标题那样命名。因此,例如,您可以拥有String[] header = inFile.getCSVHeader()
,但之后会有headerName->propertyName
的映射,因此,如果您的标题字段为:
First Name, Last Name, Age
但你的班级是
getFirstName(), setFirstName(...);
getLastName(), setLastName(...);
getYears(), setYears();
传递给read
方法而不是(String[]) {"First Name", "Last Name", "Age"}
,因为标题是,但是传递给read
,(String[]) {"FirstName", "LastName", "Years"}
数组。
答案 1 :(得分:2)
如果要使用不同的名称映射CSV标头,可以创建一个哈希映射并将其用于内部实现,例如:您可以使用“firstName”映射“First Name”,并根据您的内部名称填充您的bean ..
答案 2 :(得分:2)
使用带空格的标题分隔bean映射和标题数组。
private final String[] header = new String[] { "First Name", "Last Name"};
private final String[] dataMapping = new String[] { "firstName", "lastName"};
beanWriter = new CsvBeanWriter(new FileWriter(path), CsvPreference.EXCEL_PREFERENCE);
beanWriter.writeHeader(header);
beanWriter.write(yourPojo, dataMapping, processors);
答案 3 :(得分:1)
我意识到这是一个相当古老的帖子,但其他人可能正在寻找另一种简单的解决方案。这就是我所做的,以确保我只有alph数字标题名称,没有空格:
final String[] header = beanReader.getHeader(true);
for(int i = 0; i <= header.length -1 ; i++ ) {
header[i] = header[i].replaceAll("[^a-zA-Z0-9]+","");
}