Java 如何使用OpenCSV在同一个CSV文件上写入列,即使该文件为空?

Java 如何使用OpenCSV在同一个CSV文件上写入列,即使该文件为空?,java,csv,opencsv,Java,Csv,Opencsv,我必须编写一个代码,该代码必须能够将列(值的数组字符串[])和该列的标题写入CSV文件。在这两种情况下,它都必须将列写入一个输出.csv文件,当它不存在时,以及当已经有一个名为输入值文件的文件时。当然我想在同一个文件上读写。 代码如下: public void afegir_columna_csv(String file, String header, String[] contingut) { try { FileWriter filewriter = new File

我必须编写一个代码,该代码必须能够将列(值的数组字符串[])和该列的标题写入CSV文件。在这两种情况下,它都必须将列写入一个输出.csv文件,当它不存在时,以及当已经有一个名为输入值文件的文件时。当然我想在同一个文件上读写。 代码如下:

public void afegir_columna_csv(String file, String header, String[] contingut) {
    try {
        FileWriter filewriter = new FileWriter(file, true);
        CSVWriter csvWriter = new CSVWriter(filewriter);
        FileReader filereader = new FileReader(file);
        CSVReader csvReader = new CSVReader(filereader);
        String head = header;
        String[] values = contingut;
        String[] entries = null;
        //Adding the header part:
        String[] H = csvReader.readNext();
        ArrayList listH = new ArrayList(Arrays.asList(H));
        listH.add(head);
        csvWriter.writeNext((String[]) listH.toArray());
        Añadimos los valores:
        int i=0;
        while((entries = csvReader.readNext()) != null) {
            ArrayList list = new ArrayList(Arrays.asList(entries));
            list.add(values[i]);
            csvWriter.writeNext((String[]) list.toArray());
        }
        csvWriter.close();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}
public void add_column_csv(String[] contingut) {
    try {
        String filename = "output_preproces.csv";
        File _file = new File(filename);
        if(_file.createNewFile()) { //If the file doesn't exists, create and add the first column
            FileWriter filewriter = new FileWriter(filename, true);
            CSVWriter csvWriter = new CSVWriter(filewriter);
            List<String[]> data = new ArrayList<String[]>();
            int i=0;
            while(i < contingut.length) {
                data.add(new String[] {contingut[i]});
                i++;
            }
            csvWriter.writeAll(data);
            csvWriter.close();
        }
        else {  //If the file already exists, add a column to it:
            FileReader filereader = new FileReader(filename);
            CSVReader csvReader = new CSVReader(filereader);
            List<String[]> data = new ArrayList<String[]>();
            int i=0;
            while(i < contingut.length) {
                String[] nextLine;
                nextLine = csvReader.readNext();
                String[] aux = new String[nextLine.length + 1];
                aux[nextLine.length] = contingut[i];
                int j = 0;
                while(j < nextLine.length) {aux[j] = nextLine[j]; j++;};
                data.add(aux);
                i++;
            }
            csvReader.close();
            new FileWriter(filename, false).close();  //delete the old content of the file
            FileWriter filewriter = new FileWriter(filename, true);
            CSVWriter csvWriter = new CSVWriter(filewriter);
            csvWriter.writeAll(data);
            csvWriter.close();
        }

    } catch(Exception e) {
        e.printStackTrace();
    }
}
我一直在测试代码,这两种情况下都会发生: 1.如果文件存在但为空:它不写入第一列。 2.如果文件已经存在并且上面有列:它会抛出一个强制转换异常(我在其中强制转换(String[])list.toArray()

你知道怎么做吗? 谢谢

下面是我在测试2中遇到的错误:

java.lang.ClassCastException: class [Ljava.lang.Object; cannot be cast to class [Ljava.lang.String; ([Ljava.lang.Object; and [Ljava.lang.String; are in module java.base of loader 'bootstrap')

经过一段时间的分析,我找到了一个有效的解决方案。我不太确定它是否超高效,但它确实发挥了作用。我不得不改变从文件、标题和内容获取信息的方式,改为只获取内容。 代码如下:

public void afegir_columna_csv(String file, String header, String[] contingut) {
    try {
        FileWriter filewriter = new FileWriter(file, true);
        CSVWriter csvWriter = new CSVWriter(filewriter);
        FileReader filereader = new FileReader(file);
        CSVReader csvReader = new CSVReader(filereader);
        String head = header;
        String[] values = contingut;
        String[] entries = null;
        //Adding the header part:
        String[] H = csvReader.readNext();
        ArrayList listH = new ArrayList(Arrays.asList(H));
        listH.add(head);
        csvWriter.writeNext((String[]) listH.toArray());
        Añadimos los valores:
        int i=0;
        while((entries = csvReader.readNext()) != null) {
            ArrayList list = new ArrayList(Arrays.asList(entries));
            list.add(values[i]);
            csvWriter.writeNext((String[]) list.toArray());
        }
        csvWriter.close();
    }
    catch(Exception e) {
        e.printStackTrace();
    }
}
public void add_column_csv(String[] contingut) {
    try {
        String filename = "output_preproces.csv";
        File _file = new File(filename);
        if(_file.createNewFile()) { //If the file doesn't exists, create and add the first column
            FileWriter filewriter = new FileWriter(filename, true);
            CSVWriter csvWriter = new CSVWriter(filewriter);
            List<String[]> data = new ArrayList<String[]>();
            int i=0;
            while(i < contingut.length) {
                data.add(new String[] {contingut[i]});
                i++;
            }
            csvWriter.writeAll(data);
            csvWriter.close();
        }
        else {  //If the file already exists, add a column to it:
            FileReader filereader = new FileReader(filename);
            CSVReader csvReader = new CSVReader(filereader);
            List<String[]> data = new ArrayList<String[]>();
            int i=0;
            while(i < contingut.length) {
                String[] nextLine;
                nextLine = csvReader.readNext();
                String[] aux = new String[nextLine.length + 1];
                aux[nextLine.length] = contingut[i];
                int j = 0;
                while(j < nextLine.length) {aux[j] = nextLine[j]; j++;};
                data.add(aux);
                i++;
            }
            csvReader.close();
            new FileWriter(filename, false).close();  //delete the old content of the file
            FileWriter filewriter = new FileWriter(filename, true);
            CSVWriter csvWriter = new CSVWriter(filewriter);
            csvWriter.writeAll(data);
            csvWriter.close();
        }

    } catch(Exception e) {
        e.printStackTrace();
    }
}
public void add\u column\u csv(字符串[]续){
试一试{
字符串filename=“output_preprocesss.csv”;
文件_File=新文件(文件名);
如果(_file.createNewFile()){//如果文件不存在,则创建并添加第一列
FileWriter FileWriter=新的FileWriter(filename,true);
CSVWriter CSVWriter=新的CSVWriter(文件写入程序);
列表数据=新的ArrayList();
int i=0;
而(i

如您所见,我必须将CSVReader与CSVWriter分开,并保存列表中的所有数据

对于第一个问题:考虑如果文件中的行数少于要添加的列,那么应该怎么做。在您的情况下,如果文件是空的,while循环将永远不会使文件保持空。作为旁注,读写同一个文件不是一个好主意。您应该缓冲输入或输出数据。也许有一种方法可以在不读取文件的情况下写入列。我读取文件是因为在我的方法中,我逐行进行,我将每行的内容保存到一个数组中,并在每一行添加我想要的内容,以一个新列结束。如果有一种方法可以在不读取文件的情况下添加一个新列,那将是完美的!我知道在添加新行时这是可能的,但在列中没有看到任何!“也许有一种方法可以在不读取文件的情况下写入列”不,这是不可能的,因为文件是按行存储的。我建议将整个文件读入内存,然后操作行,然后将新的csv表写入文件(覆盖)