Jakiś czas temu pisałem programik to eksportu plików z cvs do excela wraz z agregacją danych. Klient teraz zarzyczył sobie dodatkową funkcję dos banalną ale coś nie mogę tergo ogarnąć. Mało tego zarzyczył sobie dziś popołudniu na jutro rano. Potrzebuje aby agregowane rekordy nie zapisywały się w oddzielnych plikach a w jednym. Czyli jeden plik IN równa się jeden plik OUT. W tej chwili miałem jedne zagregowany rekord równał sie jeden plik. Wrzucam cześć kodu gdzie prawdopodobnie powinienem nanieść poprawkę.
logger.info("Preparation of order");
List<String> headers = getHeaders(inputPath);
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), new ArrayList<>());
x.add(result);
res.put(entry.get(0), x);
});
res.entrySet().forEach(it -> {
Path csvPath = null;
try {
csvPath = File.createTempFile("prefix-", "-suffix").toPath();
} catch (IOException e) {
e.printStackTrace();
}
if(!String.format(it.getKey()).equals(headers.get(0))) {
Path filename = Paths.get(directoryPath.toString(), String.format("%s.xlsx", it.getKey()));
try (FileWriter out = new FileWriter(csvPath.toString());
CSVPrinter printer = new CSVPrinter(out, CSVFormat.EXCEL.withHeader(headers.toArray(new String[0])).withQuote('"').withDelimiter(DELIMITER))) {
it.getValue().forEach(ss -> {
try {
printer.printRecord(ss);
} catch (IOException e) {
e.printStackTrace();
}
});
} catch (IOException e) {
e.printStackTrace();
}
try {
csvToXlsx(csvPath, filename);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}