如何从CSV中获取一个值,增加它并使用java将其保存回来

如何从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

这是我的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/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)< /代码>将被评估。

  • Java为您提供了“使用资源进行尝试”,这将负责关闭已使用的资源。(在您的情况下,您必须在
    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,了解最佳实践会很有用。