2016-09-18 22 views
-1

我正在使用au.com.bytecode.opencsv.CSVReader讀取一個csv文件並逐一打印所有記錄。代碼是表現奇怪。它的印刷線路組在一起作爲一個單一的線,然後再它的正確打印下一組行。爲什麼以及如何在一個字段中發現「在一個字段中多行爲單行」

Link to the CSV File

請從上面的鏈接下載CSV文件。我的代碼正在考慮第一行爲 - 從第一個非標題行到下面內容行的正上方的行:

12/4/13:將AO更改爲首席財務官。「,」07/18/2016「,

此外,我的第一條數據行在其中一個字段中包含\」。你可以使用Cntrl + F來找到它,如果我從字段中刪除\,它可以正常工作。現在我的問題是什麼邏輯CSVReader用於結束上面指定的第一行?爲什麼要結束線只是其中有以下內容的行前:

13年12月4日:改變AO首席財務官「」 2016" 年7月18日,

它採取了新的生產線從'12/4/13 .........'。另外,下面的單獨線條被完美地視爲單獨的線條。

代碼,供大家參考:

csvReader reader = new CSVReader(new FileReader(fileNameWithLocation), ',', '"', 1); 

ColumnPositionMappingStrategy<DomainObj> mappingStrategy = 
          new ColumnPositionMappingStrategy<DomainObj>(); 

     mappingStrategy.setType(DomainObj.class);  

      String[] nextLine; 

      while ((nextLine = reader.readNext()) != null) 
      { 
        if (nextLine != null) 
        log.debug("Next line : " + Arrays.toString(nextLine)); 
      } 
+0

CSV文件似乎無效。它是如何產生的?並且不要在這裏發佈鏈接。發佈數據的相關部分。 – EJP

+0

我認爲發佈文件的內容會使帖子看起來非常不必要。此外,該文件是有效的。我已驗證它。 –

+0

我沒有要求文件的內容。我添加了數據的相關部分。這只是一行,而不是整個文件。 – EJP

回答

-1

反斜槓逃逸的報價,從而使引號字符被認爲是內容,而不是分隔符。閱讀器將"放入其緩衝區並繼續閱讀,直到它碰到下一個引號。

+0

鏈接到rfc https://www.ietf.org/rfc/rfc4180.txt – JEY

+0

謝謝@chrylis。我同意你的發言。但是,在我的CSV文件的第一行之後沒有匹配的「\」,它應該一直到文件末尾才能找到它,但令人驚訝的是,該行會在某些行後結束,我想知道爲什麼第一行是在下面的內容之前結束:12/4/13:將AO更改爲首席財務官。「,」07/18/2016「,如果您可以下載我的CSV並觀看,我將非常感謝您:) –

+0

這個答案沒有意義。如果引用是內容的一部分而不是分隔符,爲什麼它會讀取,直到它遇到第二個引號? – EJP

0

也發佈在opencsv support request

原因是它讀取多行是我們需要允許數據在字段中有新行。因此,當您到達行尾並且沒有關閉字段時(無關引號),在引用數據中,opencsv將讀取下一行並繼續填充該行數據。您可以通過查看列出的行上方的行來看到您的文件中的情況 - 放在一起您將看到它確實生成一行數據。

,,「440063」,「DSH440063B」,「39066」,「DSH」,「True」,「01/01/2014」,「10/01/2016」,「12」,,,「JOHNSON城市醫療中心「,」約翰遜城醫療中心區域癌症中心「,」2205 Pavilion Drive「,」101套房「,」金斯波特「,」TN「,」37660「,」4641「,,,,,,,, ,,,,,,,,,,,「Shane E. Hilton」,「首席財務官」,「4234311038」,「Trish Tanner」,「消費者健康服務公司總監」,「4233023532」,「TRISH TANNER「,」系統服務總監,PHARMACY SERVICES「​​,」10/10/2013「,」4233023532「,,,,,,,,,,,,,,」08/07/2015「,」False「,, 「12/3/13我不確定AO/SBO是否處於足夠高的水平,請致電 12/4/13:將AO更改爲首席財務官。」,「07/18/2016」,

請注意,上面的行以pls chk結尾,但沒有closequote,所以opencsv會讀取下一行a nd將第一部分數據附加到下一部分。

行情屬於數據的一部分,必須進行轉義 - 因此\」

希望幫助

斯科特·康威:)

+0

我明白,因爲「它會繼續添加線條,但是這應該發生,直到它發現一個關閉」。由於該文件沒有任何關閉\「,它應該一直到文件末尾才能成爲單行,如果你能詳細說明爲什麼它只在'pls chk'結束,那將會很棒(此外,我還沒有完全理解答案的最後部分:)) 此外,什麼應該是理想的代碼更改來解決這個問題,而無需更改CSV文件?是否低於代碼好?CSVReader reader = new CSVReader(new FileReader( fileNameWithLocation),',','''','\ 0',1); –

相關問題