在Java中读取CSV文件时出现问题。只读取第一行

时间:2013-10-25 10:45:08

标签: java csv file-io

对于Java家庭作业,我需要创建一个读写CSV文件的类。我目前在阅读CSV时遇到一些问题。下面的代码只输出代码的第一行,然后生成以下错误消息:'线程中的异常“main”java.lang.ArrayIndexOutOfBoundsException:1,位于com.gc01.FileManager.CSVManager.main(CSVManager。的java:27)”

我查看了各种示例,我知道'opencsv'包,但我需要自己编写这段代码。我已将问题定位到语句“System.out.print(data [i]);”。但是,当交叉引用这段代码时,一切似乎都没问题。

我正在使用FileInput类中的方法,这是我老师指定的方法(http://www.devjavasoft.org/SecondEdition/SourceCode/Share/FileInput.java)。

public class CSVManager {
    public static void main(String [] args){

        Scanner sc = new Scanner (System.in);
        System.out.println("Please enter the file directory of the chosen CSV");
        System.out.println("For Example: /Users/UserName/Downloads/FileName.csv");
        ///Users/ReeceAkhtar/Desktop/GeoIPCountryWhois.csv
        final String fileName = sc.nextLine();
        System.out.println("How many columns?");
        final int columns = sc.nextInt();

        BufferedReader br = null;
        String line = "";
        String splitBy = " , ";

        try {
            br = new BufferedReader(new FileReader(fileName));
            while((line = br.readLine()) != null) {
                for (int i = 0; i < columns; i++) {
                    String[] data = line.split(splitBy);
                    System.out.print(data[i]);
                }
            }
        } catch (FileNotFoundException e){
            e.printStackTrace();
        } catch (IOException e) {   
            e.printStackTrace();  
        } finally {  
            if (br != null) {  
            try {  
                    br.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }
            }
        }
        System.out.println("File Read");
    }
}

3 个答案:

答案 0 :(得分:1)

例外很清楚

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 

表示您正在尝试访问数组中不存在的第一个元素

由于您说System.out.print(data[i]);是发生例外的行,因此对于第一行 data必须只填充单个元素

使用IDE调试问题,找出split方法导致意外元素的原因。我怀疑使用,周围的空格是" , "

中的原因

答案 1 :(得分:1)

试试这个。如果你拆分for循环,一切都会好的。

String[] data = line.split(splitBy);
while((line = br.readLine()) != null){
    for (int i = 0; i < columns; i++){
        System.out.print(data[i]);
    }
}

答案 2 :(得分:0)

 while((line = br.readLine()) != null){
    for (int i = 0; i < columns; i++){
    String[] data = line.split(splitBy);
    System.out.print(data[i]);
    }
  1. 您无需任何理由在for循环内多次拆分一行。
  2. 您正在使用" , "进行拆分(,这可能是您遇到ArrayIndexOfBound例外的原因)而是使用",";如果您愿意,可以在trim()上使用data[i]来摆脱尾随/领先的空白区域。
  3. 拆分后,检查data.length等于columns的检查是否一致。
  4. 我们现在处于JDK 7时代,我们可以使用try-with-resource关闭try(){}上下文中声明的资源,允许我们摆脱finally
  5. 所以你的看起来应该如下:

      try (BufferedReader br = new BufferedReader(new FileReader(fileName))){
         while((line = br.readLine()) != null){
            String[] data = line.split(splitBy);
    
            if(data.length != columns)continue; // check for consistency, 
                                           //might throw an exception 
    
            for (int i = 0; i < columns; i++){
              System.out.print(data[i].trim());
            }
    
      }catch(IoExection ex)
      {
         ex.printStackTrace();  
      }