我正在尝试读取一个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();
}
}
答案 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这样的标准库。它提供了更多方法来处理CSV
,Tab 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.");
}
}
}