Java 读取CSV文件,arrayindex越界错误
我正在尝试读取csv文件,我创建了一个包含9个条目及其值的测试文件,但我的代码无法读取超过第二行的内容,它说该文件在超过第二个键时找不到,我已尝试尽可能多地修改它,有人能帮我吗?示例输入将包括类似的内容,但在一个csv文件中(因此,每一行中都有一个新的内容,我在这里是新手,还在这里学习编辑文本): 迭戈,2岁 玛丽亚,2岁 阿曼多,5岁 肯,1岁Java 读取CSV文件,arrayindex越界错误,java,csv,file-io,hashmap,indexoutofboundsexception,Java,Csv,File Io,Hashmap,Indexoutofboundsexception,我正在尝试读取csv文件,我创建了一个包含9个条目及其值的测试文件,但我的代码无法读取超过第二行的内容,它说该文件在超过第二个键时找不到,我已尝试尽可能多地修改它,有人能帮我吗?示例输入将包括类似的内容,但在一个csv文件中(因此,每一行中都有一个新的内容,我在这里是新手,还在这里学习编辑文本): 迭戈,2岁 玛丽亚,2岁 阿曼多,5岁 肯,1岁 publicstaticvoidmain(字符串[]args){ HashMap h=新的HashMap(511); 尝试 { Scanner rea
publicstaticvoidmain(字符串[]args){
HashMap h=新的HashMap(511);
尝试
{
Scanner readIn=new Scanner(新文件(“test1.csv”);
System.out.println(“我在这里1”);
while(readIn.hasNext())
{
System.out.print(readIn.next());//仅用于测试目的
System.out.println(“检查2”);//仅用于测试目的
String line=readIn.nextLine();
字符串str[]=line.split(“,”);
对于(int i=0;i
对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());
}
while(readIn.hasNext())
{
String line=readIn.nextLine();
字符串str[]=line.split(“,”);
对于(int i=0;i
您的for循环实际上不起作用。您将注意到,您从未在循环中实际引用i
。在OP给出答案之前,我相信您试图在一个没有逗号的字符串上拆分,但是您的代码假设有一个逗号,因此出现了越界异常。这与我告诉您println()
有问题的原因有关
就您关于
hasNext()
的问题而言,这是您知道可以从文件中读取另一行的唯一方法。如果你试图读到最后,你会遇到问题 而是自己编写代码来读取CSV
文件。我建议您使用标准库,如。它提供了更多的方法来处理CSV
,选项卡分隔文件等
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();
}
}
}
导入java.io.FileReader;
导入java.util.List;
导入org.apache.commons.csv.CSVFormat;
导入org.apache.commons.csv.CSVRecord;
公共类SO35859431{
公共静态void main(字符串[]args){
String filePath=“D:\\user.csv”;
试一试{
List listRecords=CSVFormat.DEFAULT.parse(新文件读取器(文件路径)).getRecords();
用于(CSVRecord CSVRecord:listRecords){
/*使用索引/位置获取记录*/
System.out.println(csvRecord.get(0));
}
}捕获(例外e){
e、 printStackTrace();
}
}
}
首先,HashMap类中没有这样的insert()方法。正确的方法是(k,v)&在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.");
}
}
}
导入java.io.BufferedReader;
导入java.io.File;
导入java.io.FileInputStream;
导入java.io.FileNotFoundException;
导入java.io.FileReader;
导入java.io.IOException;
导入java.io.InputStreamReader;
导入java.util.HashMap;
导入java.util.Scanner;
/**
*
*@作者小伊苏鲁·兰加纳
*/
公开课阅读{
/**
*@param指定命令行参数
*/
公共静态void main(字符串args[])抛出FileNotFoundException、IOException{
HashMap h=新的HashMap();
试一试{
BufferedReader readIn=新的BufferedReader(新文件读取器(新文件(“test.csv”));
while(readIn.ready()){
String line=readIn.readLine();
字符串str[]=line.split(“,”);
对于(int i=0;i
请提供一些示例输入。我尝试过,这些名称、数字对中的每一个都在一个新行中。您还可以提供您看到的错误输出吗?我认为这行系统是.out.print(readIn.next());可能正在删除您的代码。内容如下:我在这里1\n Diego,2检查2\n Maria,2\n-文件未找到谢谢!这起作用了。请允许我问一下,为什么需要在调用hasNext()之前执行此操作?Scanner文档()提供了如何使用每个方法的详细信息。这将使问题变得清楚。
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.");
}
}
}