Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/logging/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用CsvBeanReader时是否有跳过标题的方法?_Java_Supercsv - Fatal编程技术网

Java 使用CsvBeanReader时是否有跳过标题的方法?

Java 使用CsvBeanReader时是否有跳过标题的方法?,java,supercsv,Java,Supercsv,我有一个项目,其中我应该将对象写入CSV文件。我目前正在使用ICsvBeanWriter,但每次传递新记录时,它都会写入标题。读取文件时会产生问题 以下分别是阅读和写作的方法: public static ArrayList<communication> readCSV() throws IOException { ArrayList<communication> fileText = new ArrayList<>(); ICsvBe

我有一个项目,其中我应该将对象写入CSV文件。我目前正在使用ICsvBeanWriter,但每次传递新记录时,它都会写入标题。读取文件时会产生问题

以下分别是阅读和写作的方法:

    public static ArrayList<communication> readCSV() throws IOException {
    ArrayList<communication> fileText = new ArrayList<>();
    ICsvBeanReader beanReader = new CsvBeanReader(new FileReader("products.csv"), CsvPreference.STANDARD_PREFERENCE);
    String[] header = beanReader.getHeader(true);
    CellProcessor[] processors = new CellProcessor[]{
            new ParseDouble(), // Distance
            new ParseDouble(), // Efficiency
            new ParseDouble(),// fuel
            new ParseDouble(),// total
    };
    communication com;
        while ((com = beanReader.read(communication.class, header, processors)) != null) {
                fileText.addAll(Collections.singletonList(com));
        }
    return fileText;
}

public static void writeCSV(double tripDistance, double fuelEfficiency, double costOfFuel, double totalCost) throws Exception {

    // create a list of employee
    List<communication> EmployeeList = new ArrayList<>();
    EmployeeList.add(new communication(tripDistance, fuelEfficiency, costOfFuel, (Math.round(totalCost * 100.0) / 100.0)));

    ICsvBeanWriter beanWriter = new CsvBeanWriter(new FileWriter("products.csv",true),
            CsvPreference.STANDARD_PREFERENCE);

    String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};

    beanWriter.writeHeader(header);
    CellProcessor[] processors = new CellProcessor[]{
            new ParseDouble(), // Distance
            new ParseDouble(), // Efficiency
            new ParseDouble(),// fuel
            new ParseDouble(),// total

    };

    for (communication com : EmployeeList) {
        beanWriter.write(com, header, processors);
    }
    beanWriter.close();
}

这些代码行创建一个标题:

String[] header = new String[]{"TripDistance", "FuelEfficiency", "FuelCost", "Total"};
beanWriter.writeHeader(header);

我想您可以从代码中删除它们。

首先,您用opencsv标记了它,但实际上您似乎是在基于代码中的类名使用supercsv。这个答案是基于这一观察

阅读时跳过页眉的两种方法

选项1:reader类有一个getHeader()方法,根据文档,该方法可以完成这项工作

选项2:传递给CsvBeanReader的第一个参数是一个应该传递数据的读取器

所以如果你想跳过一个标题,你可以给它一个已经跳过的阅读器。BufferedReader有一种方便的读取行的方法,因此您可以丢弃第一行。这是假设CSV格式正确,顶部没有空行

BufferedReader br = new BufferedReader(new FileReader("products.csv"));
br.readLine(); // discard header

ICsvBeanReader beanReader = new CsvBeanReader(br, CsvPreference.STANDARD_PREFERENCE);

如果使用选项2,它将只跳过第一个标题,而不会跳过其余标题@Gimby这是一个很奇怪的说法。应该只有第一个标题。您所说的“其余部分”是什么意思?不是删除标题初始化部分而是删除
writeHeader()
BufferedReader br = new BufferedReader(new FileReader("products.csv"));
br.readLine(); // discard header

ICsvBeanReader beanReader = new CsvBeanReader(br, CsvPreference.STANDARD_PREFERENCE);