/* * Click nbfs://nbhost/SystemFileSystem/Templates/Licenses/license-default.txt to change this license * Click nbfs://nbhost/SystemFileSystem/Templates/Classes/Class.java to edit this template */ package com.megatim.fdxconvert.util; import com.megatim.typefichier.validator.utilities.ParserUtils; import static com.megatim.typefichier.validator.utilities.Utilities.getCharset; import com.megatim.fdxconvert.pojo.FileToValidateDescription; import com.megatim.fdxconvert.pojo.ColumnDefinition; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.Charset; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.nio.file.StandardOpenOption; import java.util.Collections; import java.util.List; import java.util.concurrent.atomic.AtomicBoolean; import java.util.concurrent.atomic.AtomicInteger; import java.util.logging.Level; import java.util.logging.Logger; import org.apache.commons.csv.CSVFormat; import org.apache.commons.csv.CSVParser; import org.apache.commons.csv.CSVRecord; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.xssf.usermodel.XSSFWorkbook; /** * * @author ASUS */ public class ExportToJson { public static void parseFileByColumnLength(FileToValidateDescription fileDesc, File outputFile, List colDefs) throws Exception { final int nbElts = Count.countEltsOfTextFile(fileDesc, false); int index = 1; Collections.sort(colDefs, (c1, c2) -> Integer.valueOf(c1.getPosition()).compareTo(c2.getPosition())); if (fileDesc != null) { Charset charset = getCharset(fileDesc.getFile()); //Lecture des lignes du fichier et chargement dans une liste try ( FileInputStream fis = new FileInputStream(fileDesc.getFile()); InputStreamReader isr = new InputStreamReader(fis, charset); BufferedReader reader = new BufferedReader(isr)) { if (outputFile.exists()) { outputFile.delete(); } //Initialisation du writer pour ecrire chaque objet json try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);) { bufferWriter.write("["); String line; while ((line = reader.readLine()) != null) { String json = createJson(colDefs, line); bufferWriter.write(json); if (index < nbElts) { bufferWriter.write(","); index++; } } bufferWriter.write("]"); } } } } public static void parseCsvFile(FileToValidateDescription fileDesc, File outputFile, List colDefs, boolean headerPresent) throws Exception { final int nbElts = Count.countEltsOfCsvFile(fileDesc, headerPresent); int index = 0; if (fileDesc != null) { Charset charset = getCharset(fileDesc.getFile()); AtomicBoolean withHeader = new AtomicBoolean(headerPresent); if (outputFile.exists()) { outputFile.delete(); } try ( FileInputStream fis = new FileInputStream(fileDesc.getFile()); InputStreamReader isr = new InputStreamReader(fis, charset); BufferedReader reader = new BufferedReader(isr)) { //Initialisation du writer pour ecrire chaque objet json try ( BufferedWriter bufferWriter = Files.newBufferedWriter(outputFile.toPath(), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC)) { CSVParser parser = new CSVParser(reader, CSVFormat.DEFAULT.builder() .setSkipHeaderRecord(headerPresent) .setIgnoreSurroundingSpaces(true) .setTrim(true) .setDelimiter(fileDesc.getColumnDelimiter()) .setRecordSeparator(fileDesc.getRowDelimiter()) .build()); bufferWriter.write("["); for (CSVRecord record : parser) { String[] columnsTableLine = new String[colDefs.size()]; AtomicInteger i = new AtomicInteger(0); if (!withHeader.get()) { record.forEach(column -> { columnsTableLine[i.getAndIncrement()] = column != null ? column.replaceAll(" {2,}", " ").replaceAll("\r", "").replaceAll("\n", "").replaceAll("\t", "") : ""; }); String json = createJson(colDefs, columnsTableLine); bufferWriter.write(json); if (index < nbElts) { bufferWriter.write(","); index++; } } else { withHeader.set(false); } } bufferWriter.write("]"); } } catch (Exception e) { Logger.getLogger(ImportData.class.getName()).log(Level.SEVERE, e.getMessage(), e); } } } public static void parseXlsFile(FileToValidateDescription fileDesc, File outputFile, List colDefs, boolean headerPresent) throws Exception { try ( InputStream is = new FileInputStream(fileDesc.getFile()); Workbook wb = new HSSFWorkbook(is)) { parseExcelFile(fileDesc, wb, outputFile, colDefs, headerPresent); } } public static void parseXlsxFile(FileToValidateDescription fileDesc, File outputFile, List colDefs, boolean headerPresent) throws Exception { try ( InputStream is = new FileInputStream(fileDesc.getFile()); Workbook wb = new XSSFWorkbook(is)) { parseExcelFile(fileDesc, wb, outputFile, colDefs, headerPresent); } } private static Path filePath(File file, int sheetNumber) { int extensionIndex = file.getName().lastIndexOf("."); return Paths.get(file.getParent(), file.getName().substring(0, extensionIndex) + sheetNumber + file.getName().substring(extensionIndex + 1)); } private static void parseExcelFile(FileToValidateDescription fileDesc, Workbook wb, File outputFile, List colDefs, boolean headerPresent) throws IOException, Exception { Charset charset = getCharset(fileDesc.getFile()); AtomicBoolean withHeader = new AtomicBoolean(headerPresent); for (int i = 0; i < wb.getNumberOfSheets(); i++) { Sheet sheet = wb.getSheetAt(i); final int nbElts = Count.countEltsOfXlsFile(fileDesc.getFile(), i, headerPresent); AtomicInteger position = new AtomicInteger(1); if (outputFile.exists()) { outputFile.delete(); } //Initialisation du writer pour ecrire chaque objet json try ( BufferedWriter bufferWriter = Files.newBufferedWriter(filePath(outputFile, i), charset, StandardOpenOption.APPEND, StandardOpenOption.CREATE, StandardOpenOption.SYNC);) { bufferWriter.write("["); for (org.apache.poi.ss.usermodel.Row r : sheet) { if (!withHeader.get()) { //Représente les colonnes extraites de chaque ligne du fichier String[] columnsTableLine = new String[colDefs.size()]; AtomicInteger index = new AtomicInteger(0); r.forEach(c -> { columnsTableLine[index.get()] = ParserUtils.getXlxsCellValue(c, wb, colDefs.get(index.get()).getTypeDonnee(), colDefs.get(index.get()).getFormatDate(), colDefs.get(index.get()).getSeparateurDate(), colDefs.get(index.get()).getName() ); index.incrementAndGet(); }); String json = createJson(colDefs, columnsTableLine); bufferWriter.write(json); if (position.get() < nbElts) { bufferWriter.write(","); position.incrementAndGet(); } } else { withHeader.set(false); } } bufferWriter.write("]"); } } } private static String createJson(List colDefs, String[] columnsTableLine) throws Exception { StringBuilder json = new StringBuilder(); System.out.println("----------------- colDefs.size() = " + colDefs.size()); System.out.println("---------------- columnsTableLine.length = " + columnsTableLine.length); if (colDefs.size() != columnsTableLine.length) { throw new Exception("Existence des lignes mal formattées"); } json.append("\t{\n"); int i = 0; for (ColumnDefinition c : colDefs) { String str = "\"" + c.getName() + "\" : " + "\"" + columnsTableLine[i].trim() + "\""; if (i < colDefs.size() - 1) { str += ","; } else { str += "\n"; } json.append(str); i++; } json.append("\t}\n"); return json.toString(); } private static String createJson(List colDefs, String line) { StringBuilder json = new StringBuilder(); json.append("\t{"); int i = 0; int count = 0; for (ColumnDefinition c : colDefs) { String str = "\"" + c.getName() + "\" : " + "\"" + line.substring(i, i + c.getTaille()).trim() + "\""; if (count < colDefs.size() - 1) { str += ","; } json.append(str); i += c.getTaille(); count++; } json.append("\t}\n"); return json.toString(); } }