2010-06-29 105 views
3

我正在使用Super CSV,它看起来像一个惊人的软件包。超级CSV(Java) - 以列名读取带空格的文件

我唯一担心的是如何使用名称中带空格的列。不,我不能回去并自己搬走空间。这些文件将由数百人提供给我,我没有时间回去修复每个文件的所有60列,我不能相信其他人正确地做到这一点。

如何处理标题中带空格的列(即“First Name”而非“FirstName”或“firstName”)?

谢谢!

对于代码样本,看看这里:http://supercsv.sourceforge.net/codeExamples_general.html

+0

CSV是逗号分隔值,所以应该没有问题,在字段名称空间。如果你有时间,你为什么建议这些应该是“固定的”?难道这是字段名称“应该”有空格,如果你删除它们,这将是一个错误? – maxwellb 2010-06-29 13:13:22

+0

我很困惑。什么?我可以根据自己的意愿更改数据,但我知道这样做可以不用空格。你是什​​么意思“假定”有空间。我正在使用的csv文件不是为这个自动化过程开发的,它们只是文件。 – 2010-06-29 13:17:35

+0

我很抱歉。当你说“我应该如何使用标题中的空格”时,我想也许你无法正确解析字段名称。如果您没有阅读标题,那么所有内容都是从那时开始的位置,如果您阅读它们,则可以使用标题作为CSV行中位置的提示,并将其转换为您的应用程序特定需求。 – maxwellb 2010-06-29 13:24:05

回答

2

您注意到此行的样品中链接到:

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"}阵列。

+0

但请查看UserBean类。列名是否必须与变量相对应?我有点困惑在while循环中发生了什么。 – 2010-06-29 13:15:39

+0

我在说的是,注意他是如何使用标题“用户名”,“密码”等。这些直接对应于变量的用户名和密码。我有“First Name”作为标题,不能将First Name作为变量(空格不允许使用+格式不正确)。 – 2010-06-29 13:19:38

+0

已更新,现在我明白了 – maxwellb 2010-06-29 13:21:08

2

如果您想要使用不同的名称映射CSV标头,可以创建一个哈希映射并将其用于您的内部实现,例如,你可以用“firstName”来映射“名字”,并根据你的内部名字填充你的bean。

+1

这听起来像我在找什么。你能帮我解决一下吗?我对此很不熟悉。谢谢! :) – 2010-06-29 13:21:17

+0

我希望你有解决方案,建议由maxwellb .. – 2010-06-30 10:00:30

1

我意识到这是一个相当老的帖子,但其他人可能正在寻找另一种简单的解决方案。这是我做的,以确保我只有阿尔卑斯数字标题名称没有空格:

final String[] header = beanReader.getHeader(true); 

    for(int i = 0; i <= header.length -1 ; i++) { 
    header[i] = header[i].replaceAll("[^a-zA-Z0-9]+",""); 
    } 
1

要使用空格分隔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);