2012-08-28 112 views
0

我正在嘗試編寫一個模擬記錄存儲購物車的Java程序。第一步是打開inventory.txt文件並閱讀基本上「商店必須提供」的內容。然後我需要逐一閱讀每一行並處理id記錄和價格。從逗號分隔的文本文件中讀取

當前方法輸出的結果與我所需要的非常接近,但是,它會在下一行的項目標識上顯示,如下所示。

我想知道如果有人能幫助我弄清楚如何單獨處理文本文檔中的每一行,並將每一塊數據存儲在自己的變量中,而不需要拾取下一項的id

public void openFile(){ 
    try{ 
     x = new Scanner(new File("inventory.txt")); 
     x.useDelimiter(","); 
    } 
    catch(Exception e){ 
     System.out.println("Could not find file"); 
    } 
} 

public void readFile(){ 
    while(x.hasNext()){ 
     String id = x.next(); 
     String record = x.next(); 
     String price = x.next();    
     System.out.println(id + " " + record + " " + price); 
     break; 
    } 
} 

的.txt文件:

11111, "Hush Hush... - Pussycat Dolls", 12.95 
22222, "Animal - Ke$ha", 9.95 
33333, "Hanging By A Moment - Lifehouse - Single, 4.95 
44444, "Have A Nice Day - Bon Jovi", 9.99 
55555, "Day & Age - Killers", 10.99 
66666, "She Wolf - Shakira", 15.99 
77777, "Dark Horse - Nickelback", 12.99 
88888, "The E.N.D. - Black Eyed Peas", 10.95 

實際輸出

11111 "Hush Hush... - Pussycat Dolls" 12.95 
22222 

預期的結果

11111 "Hush Hush... - Pussycat Dolls" 12.95 

回答

1

您可以使用Pattern作爲參數Scanner.useDelimiter。使用它爲分隔符提供逗號:逗號或行分隔符。

x.useDelimiter(",|" + System.getProperty("line.separator")); 

根據您的輸入文件用作行分隔符,您可能需要更改第二個選項。

使用現有CSV庫的其他解決方案中的建議很好:解析CSV 不是就像在逗號周圍分解輸入一樣簡單。

4

所以這裏的問題具體是你打破逗號,你應該打破逗號和換行符。但是還有很多其他的角落案例(例如,如果你的專欄是「abc ,,, abc」,你不應該在這些逗號上打破)。 Apache的百科全書附帶了處理所有的這些角落案件CSVParser,你應該使用它:

http://commons.apache.org/csv/apidocs/org/apache/commons/csv/CSVParser.html

+0

有許多Csv庫可用,例如在Sourceforge上有「Java CSV庫」,openCsv,JRecord,flatpac等,請參閱https://sourceforge.net/projects/javacsv/?source=directory或https://sourceforge.net/projects/opencsv/?source=目錄 –

0

有多種方式來實現這一點,但用自己的方式去,你可以使用掃描儀先讀線(使用Java的「line.separator」作爲分隔符),然後使用逗號作爲分隔符再次使用Scanner類。

0

您將面臨的問題是CSV更多的是將逗號分割爲String。有些考慮要考慮到「逃脫」的逗號(你不想過分逗留的逗號)。

我建議你節省自己很多時間和頭痛,並使用現有的API。

Apache Commons已被提及。我最近使用OpenCSV並發現它是非常簡單易用,功能強大

恕我直言

0

一個簡單的方法在整個文件轉換成字符串(行)的列表讀取...

public class Scanner { 
public static List<String> readLines(String filename) throws IOException { 
    FileReader fileReader = new FileReader(filename); 
    BufferedReader bufferedReader = new BufferedReader(fileReader); 
    List<String> lines = new ArrayList<String>(); 
    String line = null; 
    while ((line = bufferedReader.readLine()) != null) { 
     lines.add(line); 
    } 
    bufferedReader.close(); 
    return lines; 
    } 
} 

然後,您可以像以前一樣處理各個行,因爲每一行都是它自己的String對象。也就是說,如果你不使用CSVParser。

相關問題