设置字符串值时数组超出界限

时间:2014-11-14 23:09:24

标签: java string

我想要做的是将名为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中。这样,我可以通过将其替换为另一个值来处理年份列中的空白条目。

2 个答案:

答案 0 :(得分:1)

我猜问题与您的输入文件有关。请确保您的输入不是形式
" cauchy hep(21 \ 10 \ 1991)"," cauchy hep" 。注意)和"之间的空间。删除空格,如果有的话: if (line.charAt(0) == '"') { csvSplitBy = "\",";
} else { csvSplitBy = ","; }

csvSplitBy等于" \","没有字符串的最后一个字符的空格。如果您的文件没有遵循您指定的模式,则整行或整个文件将被视为单个字符串,并将存储在电影[0]中。因此电影索引1处不会有字符串,这就是为什么ArrayIndexOutOfBound。 删除空间或者您可以在开头包含空格" \""再次注意到"之间的空间。 \""它会解决问题。

答案 1 :(得分:0)

split()方法返回数组中的一个元素,这意味着line变量中不存在分隔符。

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

确保CSV文件以逗号分隔..或者数据有多个列(CSV格式正确)

我希望这可以提供帮助!