在 csv 文件中的现有数据下方追加数据 Java

Appending data below the existing data in csv file Java

我有一个包含 14 列和 5 行的 csv 文件。我正在阅读最后一列的内容,并对列值执行一些数学运算并将其保存在名为 exposureFactor[] 的数组中。现在,我必须在第一列下方明智地编写该数组列,跳过完美完成的行。但是当我再次 运行 程序时,它给了我这个错误。

Exception in thread "main" java.lang.NumberFormatException: For input string: ""
at java.base/java.lang.NumberFormatException.forInputString(NumberFormatException.java:68)
at java.base/java.lang.Integer.parseInt(Integer.java:662)
at java.base/java.lang.Integer.parseInt(Integer.java:770)
at java.base/java.util.stream.ReferencePipeline.accept(ReferencePipeline.java:212)
at java.base/java.util.Spliterators$ArraySpliterator.forEachRemaining(Spliterators.java:948)
at java.base/java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:484)
at java.base/java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:474)
at java.base/java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:550)
at java.base/java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.base/java.util.stream.IntPipeline.toArray(IntPipeline.java:538)
at com.sajood.Readingcsv.appendCol.main(appendCol.java:28)

有人可以强调这个问题吗?这是给我的一个项目,截止日期是 2 天。
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import au.com.bytecode.opencsv.CSVReader;

public class appendCol {

public static void main(String[] args) throws IOException {
    int sum = 0;
    String[] data5;
    CSVReader reader5 = new CSVReader(new FileReader("D:\new.csv"));
    String[] nextLine5;
    List<String> li = new ArrayList<String>();
    while (null != (nextLine5 = reader5.readNext())) {
        li.add(nextLine5[nextLine5.length - 1]);

    }
    String[] tempe = li.toArray(new String[0]);
    String[] exp = Arrays.copyOfRange(tempe, 1, tempe.length);
    data5 = Arrays.toString(exp).replace("[", "").replace("]", "").replace("\"", "").replace(" ", "").split(",");
    int[] weightage = Arrays.stream(data5).mapToInt(Integer::parseInt).toArray(); 
    for (int i = 0; i < weightage.length; i++) {
        sum += weightage[i];
    }
    int average = sum / 6;
    String averageStr = String.valueOf(average);
    String exposureFactor[] = { "Exposure Factor", averageStr };
    FileWriter writer4 = new FileWriter("D:\new.csv", true);
    CSVReader reader3 = new CSVReader(new FileReader("D:\new.csv"), '\t', '\'', 6);
    if ((reader3.readNext()) != null) {
        return;
     } else {
        for (int j = 0; j < exposureFactor.length; j++) {
            if (j == 0) {
                writer4.append("\n");
            }
            writer4.append(String.valueOf(exposureFactor[j]));
            writer4.append("\n");
        }
        writer4.close();
    }
}

}

唯一可能的行是:
int[] weightage = Arrays.stream(data5).mapToInt(Integer::parseInt).toArray();

我假设它正在尝试将您的空行解析为数字。为什么在输出曝光系数后还需要运行它?


如果你的老板真的需要 运行 它连续两次,快速解决方法是添加一个 try catch 并让它“优雅地”退出。

try {
    int[] weightage = Arrays.stream(data5).mapToInt(Integer::parseInt).toArray();
} catch (NumberFormatException e) {
    System.out.println("Program has already been run.");
    System.exit(0);
}

你也可以使用那个if ((reader3.readNext()) != null)检查你是否想重新做一些事情。


还有一件事:您可能希望 average 成为 double 而不是 int