我正在使用 Super CSV,它看起来像一个很棒的包。
我唯一担心的是如何处理名称中带有空格的列。不,我不能自己回去删除空格。这些文件将由数百个提供给我,我没有时间回去修复每个文件的所有 60 列,我不能相信其他人都能正确完成。
如何处理标题中有空格的列(即“名字”而不是“名字”或“名字”)?
谢谢!
对于编码示例,请看这里:http ://supercsv.sourceforge.net/codeExamples_general.html
我正在使用 Super CSV,它看起来像一个很棒的包。
我唯一担心的是如何处理名称中带有空格的列。不,我不能自己回去删除空格。这些文件将由数百个提供给我,我没有时间回去修复每个文件的所有 60 列,我不能相信其他人都能正确完成。
如何处理标题中有空格的列(即“名字”而不是“名字”或“名字”)?
谢谢!
对于编码示例,请看这里:http ://supercsv.sourceforge.net/codeExamples_general.html
您在链接到的示例中注意到这一行:
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"}
数组。
要让带有空格的标头分隔 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);
如果您想用不同的名称映射 CSV 标头,您可以创建一个哈希映射并将其用于您的内部实现,例如,您可以将“First Name”与“firstName”映射并根据您的内部名称填充您的 bean。
我意识到这是一个相当老的帖子,但其他人可能正在寻找一个替代的简单解决方案。这是我所做的,以确保我只有没有空格的字母数字标题名称:
final String[] header = beanReader.getHeader(true);
for(int i = 0; i <= header.length -1 ; i++ ) {
header[i] = header[i].replaceAll("[^a-zA-Z0-9]+","");
}