【问题标题】:Appending data below the existing data in csv file Java在 csv 文件 Java 中的现有数据下方附加数据
【发布时间】:2021-07-04 09:47:41
【问题描述】:

我有一个包含 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$4$1.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();
    }
}

}

【问题讨论】:

  • 请编辑您的问题以包含 complete 堆栈跟踪。
  • 我已经编辑了这个问题。请立即查看。

标签: java arrays eclipse csv opencsv


【解决方案1】:

唯一的可能是:
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

【讨论】:

  • 我将其转换为 int[] 因为我想对这些值执行操作。我无法在 String[] 上执行该操作
  • 对。然后在该 int[] 上执行操作,并在 new.csv 中添加一个空白行和“曝光因子”。然后您再次运行它,它会尝试将该空白行读取为数字列表,但失败了。为什么你需要第二次运行它?
  • 并且暴露因子的值也写在“暴露因子”下方。您的观点是正确的,我不需要再次运行它,但我的项目负责人要求解决它,而我从过去一周开始就一直坚持下去。我不能对这段代码做一些事情,比如任何条件,或者只运行一次然后在程序运行时从不运行的事情吗?
  • 就这么说吧!但是,如果他真的需要它优雅地退出而不是爆炸,请用 try/catch 围绕 weightage 行。我将使用代码 sn-p 编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 2020-12-14
  • 2020-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-19
  • 2021-03-15
  • 1970-01-01
相关资源
最近更新 更多