如何从CSV中获取一个值,增加它并使用java将其保存回来
这是我的csv文件:如何从CSV中获取一个值,增加它并使用java将其保存回来,java,csv,Java,Csv,这是我的csv文件: pencil,1 sharpener,1 eraser,1 pen,1 我要做的是,当我将“addpencil”作为命令行参数传递时,第一行变为pencil,2 if (args.length == 2 & "add".equals(args[0])){ String tempFile = "C:/Users/hayth/eclipse-workspace/pencilbox/src/pencilbox
pencil,1
sharpener,1
eraser,1
pen,1
我要做的是,当我将“addpencil”作为命令行参数传递时,第一行变为pencil,2
if (args.length == 2 & "add".equals(args[0])){
String tempFile = "C:/Users/hayth/eclipse-workspace/pencilbox/src/pencilbox/tmp.csv";
File oldFile = new File(path);
File newFile = new File(tempFile);
String item = ""; String quantity = "";
try {
FileWriter fw = new FileWriter(tempFile,true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
x = new Scanner(new File(path));
x.useDelimiter("[,\n]");
while(x.hasNext()){
item = x.next();
quantity = x.next();
if(item.equals(args[1])) {
quantity = quantity+1;
pw.println(item + "," + quantity);
}
else {
pw.println(item + "," + quantity);
}
}
目前执行的方式如下:
pencil,1
1
sharpener,1
eraser,1
pen,1
当我转换为整数,然后递增,然后尝试编译时,它给了我以下信息:
"ava.lang.NumberFormatException: For input string: "1
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:652)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at pencilbox.pencilBox.main(pencilBox.java:47)
这是我如何进行转换的:
while(x.hasNext()){
item = x.next();
quantity = x.next();
if(item.equals(args[1])) {
int i = Integer.parseInt(quantity);
i=i+1;
quantity = String.valueOf(i);
pw.println(item + "," + quantity);
}
else {
pw.println(item + "," + quantity);
}
我刚刚开始学习java。建议我如何克服这个问题。我已经评论了一些导致问题的部分。特别是(3)和(4)将回答您的问题
if (args.length == 2 & "add".equals(args[0])){ // (1)
String tempFile = ".../tmp.csv";
File oldFile = new File(path);
File newFile = new File(tempFile);
String item = ""; String quantity = "";
try { // (2)
FileWriter fw = new FileWriter(tempFile,true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
x = new Scanner(new File(path));
x.useDelimiter("[,\n]"); // (3)
while(x.hasNext()){
item = x.next();
quantity = x.next(); // (4)
if(item.equals(args[1])) {
quantity = quantity+1;
pw.println(item + "," + quantity);
} else {
pw.println(item + "," + quantity);
}
}
}
}
&&
,|
)来避免副作用。对于您的示例来说,这是很好的,但是考虑一个表达式,如“代码>如果(ARGS.NULL和ARGS(0)。等于(“”))<代码>将导致一个NulLoPoExtExchange异常,因为即使ARGs是代码> NUL/<代码>,<代码> ARGs(0)< /代码>将被评估。
try
-块之后关闭Writer对象
try (FileWriter fw = new FileWriter(tempFile, true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter pw = new PrintWriter(bw);
Scanner x = new Scanner(new File(path));) {...}
\n
是Unix行分隔符。最好使用System.lineseparator()
而不是\n
,因为它将产生系统特定的行分隔符字符
x.useDelimiter("[," + System.lineSeperator() + "]");
x.nextInt()
将生成下一个int值作为int
,并避免出现NumberFormatException,因为x.next()
将包含无法转换为整数的行分隔符
请注意,异常情况告诉了您大部分问题:字符串“1”(有许多尾随空格不能解析为数字。当然,因为“1”不是数字;-)。因此,第一步是使用
parseInt(quantity.trim())
作为trim()
删除此类尾随空格。当然,“更好”一词答案是遵循下面答案中的所有建议,并确保您的quantity
字符串变量从扫描仪返回时没有任何尾随空格。感谢您的提示,它解决了我的问题。这可能值得一提quantity.trim()
也是。谢谢你的建议,因为我刚刚开始学习java,了解最佳实践会很有用。