2013-04-03 83 views
2

我正在編寫一個程序來檢查前兩行(不包括頭部)是否包含任何數據。如果他們不這樣做,文件將被忽略,並且如果前兩行中的任何一行包含數據,則處理該文件。我使用OpenCSV將標題,第一行和第二行檢索爲3個不同的數組,然後檢查它們是否符合我的要求。我的問題是,即使前兩行是空的,reader返回類似[Ljava.lang.String;@13f17c9e作爲第一行和/或第二行(取決於我的測試文件)的輸出。OpenCSV即使在CSV行中沒有值時也會返回一個字符串

它爲什麼會返回任何東西,除了null,那是什麼?

+0

這是一個空字符串數組嗎? – KidTempo 2013-04-03 22:39:50

+0

我期待它是一個。但是,它的價值與問題中的價值相似。 – CodingInCircles 2013-04-03 22:41:57

+0

空字符串數組與空不相同 - 它仍然是有效的對象,並且會給出類似於您所描述的結果的結果,例如,您將.toString()應用於它。 .length()的結果是什麼?我猜0 ... – KidTempo 2013-04-03 22:46:55

回答

1

我現在不在我的計算機,所以原諒任何錯誤〜OpenCSV API Javadocs非常簡短,但似乎並沒有多大意義。讀一行應該將內容解析爲一個字符串數組。空行應導致一個空字符串數組,如果你試圖把它打印出來這給像[Ljava.lang.String;@13f17c9e ...

我會假設,下面的示例文件:

1 | 
2 | 
3 | "The above lines are empty", 12345, "foo" 

會產生如以下你做myCSVReader.readAll()

// List<String[]> result = myCSVReader.readAll(); 
0 : [] 
1 : [] 
2 : ["The above lines are empty","12345","foo"] 

要執行你在你的問題,測試長度,而不是某種空檢查或字符串比較的描述。

List<String> lines = myCSVReader.readAll(); 

// lets print the output of the first three lines 
for (int i=0, i<3, i++) { 
    String[] lineTokens = lines.get(i); 
    System.out.println("line:" + (i+1) + "\tlength:" + lineTokens.length); 
    // print each of the tokens 
    for (String token : lineTokens) { 
    System.out.println("\ttoken: " + token); 
    } 
} 

// only process the file if lines two or three aren't empty 
if (lineTokens.get(1).length > 0 || lineTokens.get(2).length > 0) { 
    System.out.println("Process this file!"); 
    processFile(lineTokens); 
} 
else { 
    System.out.println("Skipping...!"); 
} 

// EXPECTED OUTPUT: 
// line:1 length:0 
// line:2 length:0 
// line:3 length:3 
//   token: The above lines are empty 
//   token: 12345 
//   token: foo 
// Process this file! 
+0

當然,你應該使用'readNext()'而不是'readAll()'來讀取整個文件(尤其是如果文件非常大)時,應該只讀取前三行。 – KidTempo 2013-04-03 23:35:44

+0

我剛纔發現我需要檢查令牌的長度,而不是它們是否爲空。雖然,我這樣做的方式只是蠻橫的力量,而不是把任何理由放在它背後 – CodingInCircles 2013-04-03 23:48:38

相關問題