2010-06-29 58 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);