我有一個來自Java書籍示例的原始代碼。該程序只是讀取一個文本文件(「clients.txt」)。但是,我想將「clients.txt」修改爲「clients.csv」,並讓程序讀取「.csv」文件。我已經按照這種格式解析與數據「」作爲分隔符,並添加/更新兩行代碼在ReadTextFile.java
文件下只:使用掃描儀類讀取CSV文件錯誤
新增/更新的代碼:
input = new Scanner(new File("clients.csv"));
input.useDelimiter(",");
認爲這是從.txt
文件到.csv
文件的簡單修改,我得到了NoSuchElementException
或File improperly formed
打印消息。
我知道我還可以使用其他類,例如BufferedReader
和/或CsvReader
類,但只是想知道爲什麼input.useDelimiter()
方法在這裏不起作用。
=====================
錯誤消息
Process started >>>
<<< Process finished. (Exit code 0)
java ReadTextFileTest
Process started >>>
Account First Name Last Name Balance
File improperly formed.
<<< Process finished. (Exit code 1)
============ =========
ReadTextFile.java
import java.io.File;
import java.io.FileNotFoundException;
import java.lang.IllegalStateException;
import java.util.NoSuchElementException;
import java.util.Scanner;
public class ReadTextFile
{
private Scanner input;
public void openFile()
{
try
{
// Orig code: input = new Scanner(new File("clients.txt")
input = new Scanner(new File("clients.csv")); // added/updated
input.useDelimiter(","); // added
}
catch (FileNotFoundException fileNotFoundException)
{
System.err.println("Error opening file.");
System.exit(1);
}
}
public void readRecords()
{
AccountRecord record = new AccountRecord();
System.out.printf("%-10s%-12s%-12s%10s\n", "Account",
"First Name", "Last Name", "Balance");
try
{
while (input.hasNext())
{
record.setAccount(input.nextInt()); // read account number
record.setFirstName(input.next()); // read first name
record.setLastName(input.next()); // read last name
record.setBalance(input.nextDouble()); // read balance
System.out.printf("%-10d%-12s%-12s%10.2f\n",
record.getAccount(), record.getFirstName(),
record.getLastName(), record.getBalance());
}
}
catch (NoSuchElementException elementException)
{
System.err.println("File improperly formed.");
input.close();
System.exit(1);
}
catch (IllegalStateException stateException)
{
System.err.println("Error reading from file.");
System.exit(1);
}
}
public void closeFile()
{
if (input != null)
input.close();
}
}
=====================
ReadTextFileTest.java
public class ReadTextFileTest
{
public static void main(String args[])
{
ReadTextFile application = new ReadTextFile();
application.openFile();
application.readRecords();
application.closeFile();
}
}
=====================
AccountRecord.java
public class AccountRecord
{
private int account;
private String firstName;
private String lastName;
private double balance;
public AccountRecord()
{
this(0, "", "", 0.0);
}
public AccountRecord(int acct, String first, String last, double bal)
{
setAccount(acct);
setFirstName(first);
setLastName(last);
setBalance(bal);
}
public void setAccount(int acct) { account = acct; } public int getAccount() { return account; }
public void setFirstName(String first)
{
firstName = first;
}
public String getFirstName()
{
return firstName;
}
public void setLastName(String last)
{
lastName = last;
}
public String getLastName()
{
return lastName;
}
public void setBalance(double bal)
{
balance = bal;
}
public double getBalance()
{
return balance;
}
}
==== =======================
clients.txt(原始文件)
100 Bob Jones 24.98
200 Steve Doe -345.67
300 Pam White 0.00
400 Sam Stone -42.16
500 Sue Rich 224.62
100 Bob Jones -4.98
200 Steve Doe 45.67
===============================================
clients.csv(從「.TXT」更改爲「.CSV」文件),當它試圖讀取第一餘額
100,Bob,Jones,24.98
200,Steve,Doe,-345.67
300,Pam,White,0.00
400,Sam,Stone,-42.16
500,Sue,Rich,224.62
100,Bob,Jones,-4.98
200,Steve,Doe,45.67
謝謝彼得。我使用了你的建議「Pattern delimiter = Pattern.compile(」,| \ r \ n | \\ s「);」現在代碼就可以工作。 非常感謝您的幫助。 –