2014-11-14 53 views
0

我想要做的是建立一個名爲nameWithYear字符串等於是電影[0] +「(」 +電影[1] +「)」(所以「電影標題(年)「)從文本解析CSV。數組越界時設置一個字符串值

每當我嘗試,我遇到,我不斷得到一個數組越界錯誤的問題。我試圖設置字符串等於只有電影[0],它與成功。當我嘗試將它自己設置爲電影[1]時,它失敗。我可以做一個包含元素[1]的System.out,並且它的輸出很好,沒有問題。換句話說,出於某種原因,我只能在字符串中包含元素[0]而不是元素[1]。所以我假設它與聲明字符串的值有關。只是不知道是什麼。
的代碼如下:

import java.io.BufferedReader; 
import java.io.FileNotFoundException; 
import java.io.FileReader; 
import java.io.IOException; 

public class CSVParsing { 
public String parseCSV() { 

String csvFile = "C:\\Users\\RAY\\Desktop\\movies.csv"; 
BufferedReader br = null; 
String nameWithYear = new String(); 
    String line = ""; 
String csvSplitBy = ","; 

try { 

    br = new BufferedReader(new FileReader(csvFile)); 
    while ((line = br.readLine()) != null) { 

      // use comma as separator 
        if (line.charAt(0) == '"') 
        { 
         csvSplitBy = "\","; 
        } 
        else 
        { 
         csvSplitBy = ","; 
        } 
        String[] movies = line.split(csvSplitBy); 
      nameWithYear = ""+ movies[0]+" ("+movies[1]+")"; 
    } 

} catch (FileNotFoundException e) { 
    e.printStackTrace(); 
} catch (IOException e) { 
    e.printStackTrace(); 
} finally { 
    if (br != null) { 
     try { 
      br.close(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

return nameWithYear; 
} 

public static void main (String[] args) 
{ 
CSVParsing obj = new CSVParsing(); 
String testString = obj.parseCSV(); 
} 

} 

請注意,這不是100%完成,我在一小塊一小塊進行測試以確保它做的一切,我想要它做的。

更新:發現這是有關空白一年條目爲CSV的一部分。我該如何處理?一旦發現年份條目爲空白,程序就會中斷。

更新2:我用自己的研究解決了它。我在split()後將結果放入一個ArrayList中。這樣,我可以通過用另一個值替換它們來處理年份列中的空白條目。

+0

插入'的System.out.println(Arrays.toString(電影));'行'nameWithYear = 「之前」 +電影[0] + 「( 」+電影[1] +「)」;'和看如果你運行你的程序,他打印什麼。帶有條目的數組的輸出如下所示:'[array with,two entries]'。 – Tom 2014-11-14 23:13:20

+0

在調試器下運行它並檢查你的'電影'數組的值。 – 2014-11-14 23:15:59

回答

1

我想問題在於你的輸入文件。確保你的輸入不是
「cauchy hep(21 \ 10 \ 1991)」,「cauchy hep」。注意之間的空格)和「刪除空格如果有的話: if (line.charAt(0) == '"') { csvSplitBy = "\",";
} else { csvSplitBy = ","; }

csvSplitBy等於「\」,「沒有空格的字符串的最後一個字符。如果你的文件不遵循你指定的模式,整行或整個文件將被視爲單個字符串,並將存儲在電影[0]中。因此,在電影的索引1處不會有字符串,這就是爲什麼ArrayIndexOutOfBound。 刪除空格或者您可以在空格開頭添加「\」,再次注意「\」,「。」之間的空格,這樣可以解決問題。

+0

其實,你對這部分是對的。它與輸入文件有關。我仔細看了看,發現第一個空白年份是導致問題的原因。我該如何處理這種情況?用這個新發現更新了OP。 – 2014-11-15 20:02:33

+0

在我看來,你只需要在程序中編輯csvSplitBy部分就可以刪除我自己試過的錯誤。只需檢查一次。 – cauchy 2014-11-15 20:25:25

0

split()方法返回數組中的一個元素,這意味着該分隔符不存在於line變量中。

line.contains(csvSplitBy);// will be evaluated to false in case of one item is returned by split(); 

確保CSV文件是逗號分隔的..或數據已超過一列(CSV格式正確無誤)

我希望這可以幫助!