0

我正在尝试编写一个模拟唱片店购物车的 Java 程序。第一步是打开inventory.txt文件并读取基本上是“商店必须提供”的内容。然后我需要单独读取每一行并处理 id 记录和价格。

当前方法输出的结果非常接近我需要的结果,但是,它会在下一行的项目 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
4

5 回答 5

4

所以这里的问题特别是你在逗号上打断,你应该在逗号和换行符上打断。但是还有很多其他极端情况(例如,如果您的列是“abc,,,abc”,那么您不应该在这些逗号上打断)。Apache Commons 带有一个处理所有这些极端情况的 CSVParser,你应该使用它:

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

于 2012-08-28T00:14:51.940 回答
1

您可以使用 aPattern作为 的参数Scanner.useDelimiter。使用它为分隔符提供alernates:逗号或行分隔符。

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

根据您的输入文件用作行分隔符的内容,您可能需要更改第二个选项。

使用现有 CSV 库的其他答案中的建议很好:解析 CSV并不像分解逗号周围的输入那么简单。

于 2012-08-28T00:18:40.943 回答
0

有多种方法可以实现这一点,但按照您自己的方式,您可以使用 Scanner 首先读取行(使用 Java 的“line.separator”作为分隔符),然后再次使用 Scanner 类并使用逗号作为分隔符。

于 2012-08-28T00:15:12.330 回答
0

您将面临的问题是 CSV 不仅仅是将 a 拆分String为逗号。使用“转义”逗号(您不想区分逗号)需要考虑一些注意事项。

我建议您节省大量时间和头痛,并使用现有的 API。

Apache Commons 已经被提及。我最近使用了 OpenCSV,发现它非常简单易用且功能强大

恕我直言

于 2012-08-28T00:19:20.620 回答
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。

于 2012-08-28T01:27:07.837 回答