2016-02-01 52 views
1

我想在一個CSV文件中添加的數據更改卸下csv文件的報價使用opencsv

DATE  status  code      value  value2 
"2016-01-26","Subscription All","119432660","1315529431362550","0.0080099833517888" 
"2016-01-26","Subscription All","119432664","5836995058433524","0.033825584764444" 
"2016-01-26","Subscription All","119432664","8287300074499777","0.076913377834744" 
"2016-01-26","Subscription All","119432664","14870697739968326","0.0074188355187426" 

我的代碼用於格式化數據:

CSVReader reader = new CSVReader(new FileReader(new File(fileToChange)), CSVParser.DEFAULT_SEPARATOR, CSVParser.NULL_CHARACTER, CSVParser.NULL_CHARACTER, 1) 
    info "Read all rows at once" 
    List<String[]> allRows = reader.readAll(); 

    CSVWriter writer = new CSVWriter(new FileWriter(fileToChange), CSVWriter.DEFAULT_SEPARATOR, CSVWriter.NO_QUOTE_CHARACTER) 
    writer.writeAll(allRows) 
    writer.close() 

我得到的輸出是這個,添加了額外的報價而不是刪除它。

""2016-01-26"",""Subscription All"",""119432660"",""1315529431362550"",""0.0080099833517888"" 
""2016-01-26"",""Subscription All"",""119432664"",""5836995058433524"",""0.033825584764444"" 
""2016-01-26"",""Subscription All"",""119432664"",""8287300074499777"",""0.076913377834744"" 
""2016-01-26"",""Subscription All"",""119432664"",""14870697739968326"",""0.0074188355187426"" 

我想刪除引號。 請有人幫忙。

此外,是否可以將日期格式更改爲yyyymmdd而不是yyyy-mm-dd?

allRows.each { String[] theLine -> 
     String newDate = theLine[0].replaceAll('-', '') 
     String newline = theLine.eachWithIndex { String s, int i -> return i > 0 ? s : newDate} 
     writer.writeLine(newline) 
    } 

感謝

+1

它似乎不是一個bug,csv讀取器讀取qoute字符作爲字符串的一部分,並且writer將其輸出爲值的一部分,但也會將esge [es as double qoute。在這裏更多的信息:http://stackoverflow.com/questions/13969254/unwanted-double-quotes-in-generated-csv-file –

+1

我會+1,但似乎沒有投票的一天...嘆了口氣! –

回答

3

當你實例化你的CSVReader時,你告訴它不要將字符視爲引號,因此它將現有引號讀爲數據並且不會將其刪除。

當您告訴CSVWriter不要添加任何報價時,它會兌現您的請求。但是,輸入數據包含引號字符,並且CSV中的字符串中包含引號的約定是double引號。因此, 字符串值

ABC"DEF 

在CSV被編碼爲

"ABC""DEF" 

所以你看到的結果是不刪除輸入引號的組合(你告訴它不要),然後加倍輸出報價。

要解決此更改,請將輸入選項從NULL_CHARACTER更改爲DEFAULT_QUOTE_CHARACTER。但請注意,如果您的任何數據實際上包含嵌入的引號或逗號,則結果輸出將不會是有效的CSV。

另外我認爲這可能是一個針對OpenCSV的有效的錯誤報告。我相信,OpenCSV需要告訴你,它是否會在您告訴它忽略引號時產生無效的CSV,可能是通過運行時異常。雖然我想他們可能會爭辯說,你選擇了沒有網絡的工作,並且應該接受你得到的任何東西。就我個人而言,我會選擇「最不出奇的原則」,恕我直言,當輸出不加引號時,恕不另行引用。

+0

這工作..我複製了DEFAULT_QUOTE_CHAACTER這是拼寫錯誤..大聲笑 – user175084

+0

感謝您的幫助。有可能看看我的日期格式有什麼問題嗎? – user175084

+0

把這個放在一個新的問題_without_任何CSV的東西。 –

2

因爲在你的CSVReader報價被設置爲CSVParser.NULL_CHARACTER"被視爲正常的字符是讀標記的一部分。這將導致你的數組包含表單數據:

["2016-01-26", "Subscription All", "119432660", "1315529431362550", "0.0080099833517888"] 

而不是:

[2016-01-26, Subscription All, 119432660, 1315529431362550, 0.0080099833517888] 

所以請嘗試更改選項從CSVParser.NULL_CHARACTER要麼

  • '"'
  • CSVParser.DEFAULT_QUOTE_CHARACTER(它還保存'"')。
+0

感謝您的幫助。有可能看看我的日期格式有什麼問題嗎? – user175084

+1

@ user175084看起來你可能正在尋找:'allRows.forEach(row - > row [0] = row [0] .replace(「 - 」,「」));' – Pshemo