Как записать столбец в том же файле CSV с OpenCSV, даже если файл пуст? - PullRequest
1 голос
/ 26 мая 2020

Мне нужно написать код, который должен иметь возможность записывать столбец (массив значений String []) и заголовок этого столбца в файл 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();
    }
}

Я тестировал код, и вот что происходит в обоих случаях: 1. Если файл существует, но пуст: он не записывает первый столбец. 2. Если файл уже существует и в нем есть столбцы: он выдает мне исключение приведения (где я cast (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')

1 Ответ

1 голос
/ 26 мая 2020

Через некоторое время, проанализировав проблему, я нашел решение, которое работает. Я не совсем уверен, суперэффективен ли он, но свою работу выполняет. Пришлось изменить способ получения информации из файла, заголовка и содержимого только на содержимое. Вот код:

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();
    }
}

Как видите, мне пришлось отделить CSVReader от CSVWriter и сохранить все данные в списках.

...