Eksport danych z CSV

0

Przerzucam dane z pliku csv do exceli. Dokładnie wygląda to tak że z jednego dużego pliku który zawiera bardzo dużą ilosć zamówien i mam wyciągnąć każde zamówienei do osobnego pliku. Z tym że w przypadku kiedy zamowienie się powiela cześć danych z kolumn sprowadzam to do jednego wiersza( np. kolumy od A do F). Wstępnie było to tak że z koluny A była pobierana nazwa i jak się dublowała to zawijałem wiersze do tej kolumny F. Teraz doszło mi coś takiego że dubluje się jedynie wtedy kiedy w kolumnie A i B są te same dane. I w tej chwili nadpisuje mi się rekord a nie zawija czyli dostaje zawsze nagłówki + jedną linie rekordu. Poniżej wklejam kod może ktoś podpowie co jest nie tak ?

private void process(List<CSVRecord> entries, Path directoryPath, Path inputPath) throws IOException {
        logger.info("Preparation of order");
        List<String> headers = getHeaders(inputPath);
        LinkedHashMap<String, List<List<Object>>> res = new LinkedHashMap<>();
        LinkedHashMap<String, String> orders = new LinkedHashMap<>();
        HashSet<String> revision = new HashSet<>();


        entries.forEach(entry -> {
            int cutoff = 0;
            if (orders.keySet().contains(entry.get(0))) {
                cutoff = 7;
            }
            revision.add(entry.get(1));
            orders.put(entry.get(0), entry.get(1));
            List<String> csvTokens = Streams.stream(entry.iterator()).collect(Collectors.toList());
            List<String> secondPart = csvTokens.subList(cutoff, csvTokens.size());
            Stream<Object> nulls = Collections.nCopies(cutoff, null).stream();
            List<Object> result = Stream.concat(nulls, secondPart.stream()).collect(Collectors.toList());
            List<List<Object>> x = res.getOrDefault(entry.get(0), new ArrayList<>());
            x.add(result);
            res.put(entry.get(0) + "_" + entry.get(1), x);
        });


        res.entrySet().forEach(it -> {
            Path csvPath = null
2

Przerzucam dane z pliku csv do exceli. Dokładnie wygląda to tak że z jednego dużego pliku który zawiera bardzo dużą ilosć zamówien i mam wyciągnąć każde zamówienei do osobnego pliku.

Czyli problem polega na rodzieleniu jednego dużego pliku z zamówieniami na pliki per zamówienie tak?

Z tym że w przypadku kiedy zamowienie się powiela cześć danych z kolumn sprowadzam to do jednego wiersza( np. kolumy od A do F).

Jak zamówienie może się powielać?

Ogólnie to brakuje mi schematu pliku CSV, który przetwarzasz. Na pewno jedna z kolumn zawiera ID zamówienia tak? Jeżeli tak to ja bym sobie posortował rekordy w pliku według tego ID Zamówienia i potem w pętli leciał kolejne rekordy, dopóki ID Zamówienia = ID Zamówienia danego rekordu.
Jak Ci się zacznie rekord z nowym ID Zamówienia to tamto wypluwasz do pliku CSV i obracasz kolejne.

0

@.andy: Tak. Dostaje plik gdzie w kolumnie A znajduja się nazwy zamówień np. ZAM12, ZAM12, ZAM12, ZAM22,ZAM22... i te zamówienia z tą samą nazwą np. ZAM12 mają być w jednym pliku o nazwie ZAM12. Z tym że teraz potrzebuje dodatkowo wyciągnąć dane z kolumny B 0,1 itp. W przypadku kiedy ZAM12, 0... i ZAM12, 0... to będzie to samo i będzie miało byc w jednym pliku to ZAM12,1... ZAM12, 1... będzie to juz inne zamówienie i powinno znajdować się w innym pliku. W załaczniku przykład i na pomaranczowo jak to powinno wyglądać po całym procesie( oczywiscie w osobnych plikach te dwa rekordy)
screenshot-20210625120032.png

Ja to już mam posortowane według tabeli A.

screenshot-20210625120133.png

ale dostaje coś takeigo jak w zalczoniku 2.

Nie wiem czy gdzieś w kolekcji zle ogarnełem to czy problem w innym miejscu

I w tym miejscu mam coś źle bo anu razu nie wchodzi mi do warunku

if (orders.keySet().contains(entry.get(0))) {
                cutoff = 7;
            }
2

@SpectreDev: nie mam teraz za bardzo jak kodu napisać ale ty masz w takim razie dwa klucze, które tworzą ID Zamówienia. Pierwszy klucz to kolumna A a drugi kolumna B.

Zaczynasz od pierwszego wiersza i ustawiasz aktualny klucz na A + B. Wrzucasz ten rekord i odczytujesz kolejny. Jeżeli (A +1) + (B + 1) to jest to samo co A + B to dodajesz ten rekord, bo jest to to samo zamówienie.
Jeżeli natomiast (A + N) + (B + N) != A + B, to tamto co masz w tempie zapisujesz do pliku i operację zaczynasz od nowa.

EDYTKA

A czy nie łatwiej by było scalić kolumnę A i B? ;) W końcu obie tworzą ID Zamówienia. Potem na potrzeby zapisu do pliku możesz je rozdzielić.

0

Dzięki za odp. Udało mi się zrobić to trochę inaczej, myślę zę w łatwiejszy sposób

        LinkedHashMap<String, List<List<Object>>> res = new LinkedHashMap<>();
        HashSet<String> orders = new HashSet<>();

        entries.forEach(entry -> {
            int cutoff = 0;
            if (orders.contains(entry.get(0) + entry.get(1))) {
                cutoff = 7;
            }
            orders.add(entry.get(0) + entry.get(1));
            List<String> csvTokens = Streams.stream(entry.iterator()).collect(Collectors.toList());
            List<String> secondPart = csvTokens.subList(cutoff, csvTokens.size());
            Stream<Object> nulls = Collections.nCopies(cutoff, null).stream();
            List<Object> result = Stream.concat(nulls, secondPart.stream()).collect(Collectors.toList());
            List<List<Object>> x = res.getOrDefault(entry.get(0) + entry.get(1), new ArrayList<>());
            x.add(result);
            res.put(entry.get(0) + entry.get(1), x);
        });

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