我正在尝试编写一个模拟唱片店购物车的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
答案 0 :(得分:4)
所以这里的问题特别是你在破解逗号,你应该打破逗号和换行符。但是还有很多其他的极端情况(例如,如果你的专栏是“abc ,,, abc”你不应该打破那些逗号)。 Apache Commons附带了一个处理所有这些极端情况的CSVParser,您应该使用它:
http://commons.apache.org/csv/apidocs/org/apache/commons/csv/CSVParser.html
答案 1 :(得分:1)
您可以使用Pattern
作为Scanner.useDelimiter
的参数。使用此选项可为分隔符提供alernates:逗号或行分隔符。
x.useDelimiter(",|" + System.getProperty("line.separator"));
根据输入文件用作行分隔符的内容,您可能需要更改第二个选项。
使用现有CSV库的其他答案中的建议很好:解析CSV 不是就像分解逗号周围的输入一样简单。
答案 2 :(得分:0)
有多种方法可以实现这一目标,但是按照自己的方式,你可以使用Scanner首先读取行(使用Java的“line.separator”作为分隔符),然后再使用Scanner类作为分隔符。
答案 3 :(得分:0)
您将面临的问题是CSV只是在逗号上分割String
。有一些注意事项需要考虑“转义”逗号(您不想反对的逗号)。
我建议你为自己节省很多时间并且头脑疼痛并使用现有的API。
已经提到了Apache Commons。我最近使用OpenCSV并发现它非常简单易用且功能强大
IMHO
答案 4 :(得分: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。