Запишите член класса в файл csv

Я работаю над проектом, в котором у меня есть класс Macchine (автомобили), и я хочу, чтобы пользователь вставил новый автомобиль, а затем сохранил его в CSV-файле.

public static void inserimento(){
        List<Macchina> macchine = new ArrayList<>();
        String continua;
        do {
            System.out.println("Inserisci i dettagli della macchina:");
            
            System.out.print("Produttore: ");
            String produttoreinput = console.readLine();
            
            System.out.print("Modello: ");
            String modelloinput = console.readLine();
            
            System.out.print("Accelerazione (0-100 km/h in secondi): ");
            String accinputstr = console.readLine();
            double accinput = Double.parseDouble(accinputstr);
            
            System.out.print("Velocità Massima (km/h): ");
            String vmaxinputstr = console.readLine();
            double vmaxinput = Double.parseDouble(vmaxinputstr);

            System.out.print("Numero di porte: ");
            String numporteinputstr = console.readLine();
            int numporteinput = Integer.parseInt(numporteinputstr);
            

            macchine.add(new Macchina(produttoreinput, modelloinput, accinput, vmaxinput,                        numporteinput));

            System.out.print("Vuoi inserire un altro veicolo? (s/n): ");
            continua = console.readLine();
            
        } while (continua.equalsIgnoreCase("s"));

        // Salva i dati nel file
        try (BufferedWriter writer = new BufferedWriter(new FileWriter("macchine.txt"))) {
            for (Macchina macchina : macchine) {
                writer.write(macchina.toString());
                writer.newLine();
            }
            System.out.println("I dati sono stati salvati nel file .");
        } catch (IOException e) {
            System.out.println("Errore durante il salvataggio dei dati: " + e.getMessage());
        }
    }

Это функция, которая обрабатывает ввод и сохранение.

public String toString(){
        return "Produttore: " + super.getproduttore() + " Modello: " + this.getnome() + " Numero di porte: " + Integer.toString(this.getnumporte()) + "  Accelerazione (0-100 km/h): " + Double.toString(super.getvmax()) +"s" + "  Velocità massima: " + Double.toString(super.getacc()) +"km/h";
    }

И это функция в классе Macchina. Проблема в том, что когда я вставляю машину, она сохраняется, как на изображении, и мне хотелось бы иметь по одному столбцу для каждой информации. Как я могу это сделать?

🤔 А знаете ли вы, что...
Java имеет систему управления зависимостями, известную как Maven.


64
2

Ответы:

Решено

Измените функцию toString следующим образом:

public String toString(){
    return super.getproduttore() + ";" + this.getnome() + ";" + Integer.toString(this.getnumporte()) + ";" + Double.toString(super.getvmax()) +";" + Double.toString(super.getacc()) ;
}

и укажите строку заголовка следующим образом:

String header = "Produttore;Modello;Numero di porte;Accelerazione(0-100 km/h);Velocità massima (km/h)";

запишите эту строку в файл .csv (замените .txt на .csv) перед циклом

writer.write(header);
for (Macchina macchina : macch...

Не злоупотребляйте toString

Метод toString предназначен для сброса данных во время отладки.

Не переопределяйте этот метод для CSV.

CSV-методы

Добавьте методы для генерации и анализа текста CSV.

record Vehicle ( String make , String Model , double acceleration , … ) 
{
    String toCsv()
    {
        return this.make + "," + … + "\n" ;
    }

    static Vehicle fromCsv ( String line ) { … return new Vehicle ( … ); }
}

Платформа обработки CSV

CSV не так прост, как кажется.

Прежде всего, что, если ваш контент содержит разделитель ? Тогда вам нужно бежать.

Во-вторых, необходимо соблюдать стандартную спецификацию RFC 4180.

Поэтому идеальное решение — использовать библиотеку обработки CSV, а не делать это самостоятельно. К счастью, у вас есть выбор из нескольких хороших библиотек в экосистеме Java. Например, Apache Commons CSV и OpenCSV.

Чтобы узнать больше, выполните поиск по переполнению стека. Эта тема уже неоднократно поднималась.