读取CSV文件,arrayindex越界错误

时间:2016-03-08 05:07:20

标签: java csv file-io hashmap indexoutofboundsexception

我正在尝试读取一个csv文件,我创建了一个包含9个条目及其值的测试文件,但是我的代码不会读取超过第二行,它说文件找不到第二个关键,我尽可能地试着推文,有人能帮帮我吗?示例输入将包含类似的内容,但在csv文件中(因此每个新行,我是新来的,仍然在这里学习编辑文本): 迭戈,2 玛丽亚,2 阿曼多,5 肯,1

public static void main(String[] args) {

    HashMap<String, Integer> h = new HashMap<String, Integer>(511);


    try
    {
        Scanner readIn = new Scanner (new File ("test1.csv") );
        System.out.println("I'm here 1");


        while ( readIn.hasNext() )
        {               

            System.out.print(readIn.next());// for testing purposes only
            System.out.println("Check 2"); // for testing purposes only 


            String line = readIn.nextLine();
            String str[] = line.split(",");

            for (int i = 0; i < str.length ; i++)
            {
                String k = str[0];
                int v = Integer.parseInt(str[1]);
                h.insert(k , v);
            }

            System.out.println(h.toString());

        }
        readIn.close();     
    }

    catch (ArrayIndexOutOfBoundsException ob)
    {
        System.out.println(" - The file wasn't found." );
    } 

    catch (FileNotFoundException e) 
    {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
}

4 个答案:

答案 0 :(得分:0)

对next()或nextLine()的调用应该在调用hasNext()之前。但在你的代码中,你检查了hasNext()是否在while循环中返回true,然后调用next()和循环中的nextLine()。 您可以按如下方式修改代码:

while ( readIn.hasNext() )
            {               

                String line = readIn.nextLine();
                String str[] = line.split(",");

                for (int i = 0; i < str.length ; i++)
                {
                    String k = str[0];
                    int v = Integer.parseInt(str[1]);
                    h.put(k , v);
                }

                System.out.println(h.toString());

            }

答案 1 :(得分:0)

你的for循环实际上并没有达到目的。你会注意到你实际上从未在循环中引用i。在OP的回答之前,我相信你试图分裂一个没有逗号的字符串,但是你的代码假设一个将存在,因此超出范围异常。这与我告诉你println()有问题的原因有关。

至于关于hasNext()的问题,这是您知道可以从文件中读取另一行的唯一方法。如果您尝试阅读结束,您将遇到问题。

答案 2 :(得分:0)

而是编写代码来自己阅读CSV文件。我建议你使用像Apache Commons CSV这样的标准库。它提供了更多方法来处理CSVTab separated file等...

import java.io.FileReader;
import java.util.List;

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVRecord;

public class SO35859431 {
    public static void main(String[] args) {
        String filePath = "D:\\user.csv";
        try {
            List<CSVRecord> listRecords = CSVFormat.DEFAULT.parse(new FileReader(filePath)).getRecords();
            for (CSVRecord csvRecord : listRecords) {
                /* Get record using index/position */
                System.out.println(csvRecord.get(0));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

答案 3 :(得分:0)

首先在HashMap类中没有这样的insert()方法。正确的方法是放入(k,v)&amp;在while循环中它应该是hasNext()。以下是我的代码替代BufferedReader。

/ *  *要更改此许可证标题,请在“项目属性”中选择“许可证标题”。  *要更改此模板文件,请选择“工具”|模板  *并在编辑器中打开模板。  * / 包读;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Scanner;

/**
 *
 * @author Isuru Rangana Jr
 */
public class Read {

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) throws FileNotFoundException, IOException {
        HashMap<String, Integer> h = new HashMap<String, Integer>();

        try {
            BufferedReader readIn = new BufferedReader(new FileReader(new File("test.csv")));

            while (readIn.ready()) {

                String line = readIn.readLine();
                String str[] = line.split(",");


                for (int i = 0; i < str.length; i++) {
                    String k = str[0];
                    int v = Integer.parseInt(str[1]);
                    h.put(k, v);
                }

                System.out.println(h.toString());

            }
            readIn.close();
        } catch (ArrayIndexOutOfBoundsException ob) {
            System.out.println(" - The file wasn't found.");
        }
    }

}