2015-06-21 57 views
0

我有一個來自Java書籍示例的原始代碼。該程序只是讀取一個文本文件(「clients.txt」)。但是,我想將「clients.txt」修改爲「clients.csv」,並讓程序讀取「.csv」文件。我已經按照這種格式解析與數據「」作爲分隔符,並添加/更新兩行代碼在ReadTextFile.java文件下只:使用掃描儀類讀取CSV文件錯誤

新增/更新的代碼:

input = new Scanner(new File("clients.csv")); 
input.useDelimiter(",");  

認爲這是從.txt文件到.csv文件的簡單修改,我得到了NoSuchElementExceptionFile 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 

回答

0

你的代碼失敗。由於您的分隔符只是逗號(,)。它試圖讀取24.98<new-line>200作爲一個雙。

我們可以使用逗號和換行符作爲使用Pattern的分隔符。

import java.util.regex.Pattern; 

Pattern delimiter = Pattern.compile(",|\\s"); 
input = new Scanner(new File("clients.csv")).useDelimiter(delimiter); 

有一行文件的一些尾隨空格,所以我用,|\\s否則,你可以使用,|\n,|\n|\r\n

+0

謝謝彼得。我使用了你的建議「Pattern delimiter = Pattern.compile(」,| \ r \ n | \\ s「);」現在代碼就可以工作。 非常感謝您的幫助。 –

0

您的CSV文件必須是:

100,Bob,Jones,24.98,200,Steve,Doe,-345.67,300,Pam,White,0.00,400,Sam,Stone,-42.16,500,Sue,lastName,0.00 

CSV文件不能包含\n(換行符),因爲它會爲你的程序非法字符。因爲你的分隔符是,而不是\n

但要保持你的clients.csv文件,因爲它是,你可以用下面的方法:

input.useDelimiter(Pattern.compile(",|\\n|\\r")); 
+0

謝謝Aditya。 Peter Neyen的回覆將有助於補充和回答我的問題。感謝您的幫助。 –