CSV Parser Writer w Java - proszę o komentarze

0

Prosty projekt w ramach nauki wlasnej. W sumie to ktos mi kiedys to zadal, a wczoraj zrobilem.
Bez używania żadnej biblioteki do parsowania. W sumie pewnie sprobuje zrobic to samo z apache commons.
Uzyłem try with resources, zeby bylo autoclosable.
Prosilbym o jakis komentarz. Czy uzycie main, 2 razy we writer i parser jest ok, czy powinienem to jakos inaczej zrobic?

Treść napisał(a)

Stwórz klasy:

  • Person (np. Imie i Nazwisko, PESEL, Adres)
  • CSVWriter
  • CSVParser

Stworz na dysku plik *.csv z przykladowymi danymi dla klasy Person.

Napisz parser plikow csv dla klasy Person i writer dopisujący do istniejącego pliku kolejne obiekty klasy Person w formacie csv.

id - w sensie pesel.

Klasa Person:

public class Person {

    private long id;
    private String name;
    private String address;


    public Person(long id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    @Override
    public String toString()  {
        return id + ", " + name + ", " + address;
    }
}

Klasa CSVWriter:

import java.io.*;

public class CSVWriter {

    public static void main(String[] args) {

        try (FileOutputStream outputStream = new FileOutputStream("people.csv", true); //starczylo dopisac true by dopisywalo na koncu...
             BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(outputStream))) {

            Person person1 = new Person(86010569198L, "Andrzej Kowalski", "ul. Sosnowa 15");
            Person person2 = new Person(97010569198L, "Janusz Migdalski", "ul. Kawowa 34");
            Person person3 = new Person(80010569198L, "Arek Patrycjowy", "ul. Maslowa 107");

            bufferedWriter.write(person1.toString());
            bufferedWriter.newLine();
            bufferedWriter.write(person2.toString());
            bufferedWriter.newLine();
            bufferedWriter.write(person3.toString());
            bufferedWriter.newLine();

        } catch (FileNotFoundException e) {
            System.out.println("File not found ");
        } catch (IOException e) {
            System.out.println("Unable to write the file ");
        }
    }
}

Klasa CSVParser:

import java.io.*;

public class CSVParser {

    public static void main(String[] args) {

        try (FileInputStream input = new FileInputStream("people.csv");
             BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(input))) {

            String strLine;
            String cvsSplitBy = ",";

            while ((strLine = bufferedReader.readLine()) != null) {
                String[] people = strLine.split(cvsSplitBy);

                System.out.println("Person [PESEL= " + people[0]
                        + " , name=" + people[1] + " , address=" + people[2] + "]");

                if (people[0].length() != 11)
                    throw new Exception("Error: invalid id number"); //wyrzuca błąd w przypadku wpisania złego nr pesel
            }

        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

dodanie znacznika <quote> - @furious programming

0

przeciez to jest bez sensu. to klasa csvwriter powinna wiedziec jak nalezy zapisywać w danym formacie a u ciebie to klasa z danymi się tym zajmuje. powinno to tez byc uniwersalne a twój kod działa tylko dla tego twojego przykładu

0

Mozesz nieco rozwinac mysl i zasugerowac troche jasniej jak to poprawic?

Jestem na tyle newbie, ze ciesze sie, ze w ogole cokolwiek dziala... To ktos mi zadal i nie mam juz kontaktu i staralem sie podazac za instrukcjami. Wiec sorry, ze od razu nie kumam jak to zrobic.

0
  1. Main powinien być jeden i to w zupełnie osobnym pliku i powinien korzystać z tych twoich 3 klas.
  2. Logika klas powinna być zawarta w niestatycznych elementach.
  3. Person nie powinno zawierać żadnej logiki zwiazanej z CSV! Person nie wie że ktoś będzie próbował zapisywać obiekty tej klasy / wczytywać obiekty tej klasy!
public static void main(String[] args){
    CSVWriter csvWriter = new CSVWriter("people.csv");
    Person p1 = new Person(1,"aa","bb");
    Person p2 = new Person(2,"cc","dd");
    csvWriter.write(p1);
    csvWriter.write(p2);
    csvWriter.close();
    
    CSVReader csvReader = new CSVReader("people.csv");
    Person p1 = csvReader.read();
    Person p2 = csvReader.read();
    csvReader.close();
}

Mniej więcej tak wyglądałby przykładowy main.

0

napisać dobrze takie csv savera i loadera to nie taka prosta sprawa. Nie możesz skorzystać z gotowych bibliotek?

takimi rzeczami jak format danych (np. separator) powinna zajmować się klasa savera/loadera. Przydałaby się jeszcze jakaś walidacja pliku.
jeżeli to ma być zaadnie do szkoły to najprymitywniej możesz próbować w ten sposób:

import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;

interface CsvAble {
    public String toCsvLine();
}

class CsvSaver {
    public static void save(CsvAble csv, String filename) {
        try (FileWriter out = new FileWriter(filename, true)) {
            out.write(csv.toCsvLine() + "\n");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

class Person implements CsvAble {
    private Long id;
    private String name, address;

    Person(Long id, String name, String address) {
        this.id = id;
        this.name = name;
        this.address = address;
    }

    @Override
    public String toCsvLine() {
        return id + "," + name + "," + address;
    }

    @Override
    public String toString() {
        return name + " " + address;
    }
}

public class Main {
    public static void main(String[] args) {
        List<CsvAble> toSave = Arrays.asList(
                new Person(1L, "greherhtr", "erhryjsrgrst"),
                new Person(12L, "eheggr", "erhryjsreher"),
                new Person(45L, "dfhdtwrg", "jytjrthgrfwe")
        );
        toSave.forEach(o -> CsvSaver.save(o, "test.csv"));
    }
}
  • saver , ale nie wiem czy to się można obejść bez znajomości generyków.
0

Dzięki bardzo za odpowiedzi. Pokombinuje.

Dostalem to zadanie od kogos kogo radzilem sie od czego zaczac, bylo to jakis czas temu, ale nie mialem czasu i teraz wracam z powrotem do nauki.
I w sumie dostalem to na 2 zadanie. A moja obecna nauka to moze z miesiac, po godzinach. Wiec to rozwiazuje na sucho, w ramach nauki.

Jak tylko zaczalem googlowac to zaczely wyskakiwac mi biblioteki, ale mialem to zrobic bez. Z biblioteka chcialem w nastepnej kolejnosci.
No i chcialem uzyc strumieni.

z tymi 2 mainami... zasugerowalem sie troche jednym tutorialem. Ale cos mi tu nie pasowalo ;)

0

Zacznij o podstaw. Na Jave8 i strumienie przyjdzie czas.

0

thx za komentarze. Nie no Javy 8 to ni ruszam jeszcze ;)
Tak na szybko z rana zaciagnalem do pracy do tego OpenCSV http://opencsv.sourceforge.net/
By po prostu uzyskac jakis efekt. Ledwo zaczalem a juz to sie wydaje duzo przyjemniejsze niz rozpisanie tego wszystkiego samemu. Pewnie, zeby mozna to zrobic jeszcze lepiej przy uzyciu opencsv.

Jeszcze moze pomęcze bez biblioteki... ale nie do konca rozumiem takie podejscie. Bo to takie wymyslanie koła na nowo.

import java.io.FileReader;
import java.io.FileWriter;

import au.com.bytecode.opencsv.CSVReader;
import au.com.bytecode.opencsv.CSVWriter;

public class Main
{
    public static void main(String[] args) throws Exception
    {

        CSVReader reader = new CSVReader(new FileReader("people.csv"), ',' , '"' , 0);

        String [] nextLine;
        while ((nextLine = reader.readNext()) != null) {
            System.out.println("[id: "+ nextLine[0] + ", name: "+nextLine[1] + ", address: "+ nextLine[2]+"]");

        }

        CSVWriter writer = new CSVWriter(new FileWriter("people.csv", true), '\n', CSVWriter.NO_QUOTE_CHARACTER);
        String[] entries = "86010569198, Mariusz Kowalski, ul. Sosnowa 15#86010569198, Mariusz Kowalski, ul. Sosnowa 15".split("#");
        writer.writeNext(entries);
        writer.close();

    }
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1