Skip to content

Process flat files parsing to object marshaller unmarshaller

AtHerGloaguen/FlatFile_JAFFB

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

19 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

FlatFile_JAFFB

flat file Process marshaller unmarshaller for the parsing

JAFFB parsing and mapping for the file flat with annotation imitating JAXB

Flat file management

Description

This library is there to transform a flat file or a string into an object. It works by annotation.

Cette librairie est là  pour transformer un fichier plat ou une chaine de caractère en objet. Elle fonctionne par annotation.

code exemple

classe de description de ligne

public class LigneSimple {
    //total 185 
    //format dix 0
    @PositionalMappingParse(offset = 1, length = 10)
    @PositionalJavaTypeAdapter(value=NumberConvertDix0.class)
    private Integer idLigne ;
    @PositionalMappingParse(offset = 11, length =10,padding=PositionalMappingParse.TOP,stripChaine=true)
    private String colume ;
    @PositionalMappingParse(offset = 21, length = 8,required=true)
    @PositionalControlRegex(expression="([0-9]{2})([0-9_A-Z]{6})")
    private String refference ;
    //il faut convertir en tableau
    @PositionalMappingParse(offset = 29, length = 97)
    @PositionalJavaTypeAdapter(value=ConvertStringTableauString.class)
    private String[] valueRef ;
    @PositionalMappingParse(offset = 126, length = 60)
    private String code ;
    
    getters and setter {
    ....
    
    }

class adapter extends de PositionalAdapter

public class DateConvertddMMyyyy extends PositionalAdapter<String, Date> {

    private static SimpleDateFormat sdf = new SimpleDateFormat("ddMMyyyy");

    @Override
    public Date unmarshal(String v) throws Exception {
        Date d = null;

        try {
            if (!StringUtils.isBlank(v)) {
                d = sdf.parse(v);
            }

        } catch (Exception e) {
            d = null;
            System.err.println(e + " est null");
        }

        return d;
    }

    @Override
    public String marshal(Date v) throws Exception {
        if (v == null) {

            return "        ";

        }
        return sdf.format(v);
    }
    

classe de type root pour un fichier avec une entête et des lignes identiques par la suite

@PositionalFormatFile(name = "FileRootForFFPMSimple")
public class FileRootForFFPMSimple {
    // no de l'attribut , le nombre de ligne conserner
    @PositionalMappingParseRootElem(name = "enteteSimple",numbersRowsIterator=1, startRowsIterationLigne = 1,valuLongueurChaine=56,theclass=EnteteSimple.class)
    private EnteteSimple enteteSimple ;
    
    @PositionalMappingParseRootElem(name = "ligneSimples",list=true,theclass=LigneSimple.class, startRowsIterationLigne = 2,valuLongueurChaine=185)
    private List<LigneSimple> ligneSimples ;

classe si les lignes sont à différencier avec une Regex

befort a ete rajouté pour traité la chaine avant parcing

@PositionalMappingParseRootElem(startRowsIterationLigne = 1,list = true, name = "enteteSimple", expression = "^((Test1Simple )(.*)|(Test1Complex)(.*))", theclass = EnteteComplex.class, charcatereRepli = ' ')
    private List<EnteteComplex> enteteComplex ;
    
    
    @PositionalMappingParseRootElem(startRowsIterationLigne = 2, list = true, name = "ligneA", expression =  "^(LIGNEA)(.*)", theclass = LigneComplex.class, charcatereRepli = ' ')
    private List<LigneComplex> ligneA ;

    @PositionalMappingParseRootElem(startRowsIterationLigne = 3, list = true, name = "ligneB", expression = "^(LIGNEB)(.*)", theclass = LigneComplex.class, charcatereRepli = ' ')
    private List<LigneComplex> ligneB ;
    
    @PositionalMappingParseRootElem(startRowsIterationLigne = 4, list = true, name = "ligneC", expression = "^(LIGNEC)(.*)", theclass = LigneComplex.class, charcatereRepli = ' ')
    private List<LigneComplex> ligneC ;
    
    @PositionalMappingParseRootElem(startRowsIterationLigne = 5, list = true, name = "ligneD", expression = "^(LIGNED)(.*)", theclass = LigneComplex.class, charcatereRepli = ' ')
    private List<LigneComplex> ligneD ;
    
    // ligne qui ne correspond à aucune expression
    @PositionalMappingParseRootElem(startRowsIterationLigne = 6, list = true, name = "ligneE", expression =PositionalMappingParseRootElem.NOEXPRES , theclass = NonTraiter.class, charcatereRepli = ' ')
    private List<NonTraiter> ligneE ;
    
    

    getters and setter {
    ....
    
    }

utilisation lecture

    
        /**
         * lecture et création d'un objet
         * 
         */
        JAFFBContext contex = JAFFBContext.newInstance(FileRootForFFPMSimple.class) ;
        Unmarshaller unmarshaller = contex.createUnmarshaller();
        
        FileRootForFFPMSimple ffpmSimple = (FileRootForFFPMSimple) unmarshaller.unmarshal(new File("RessourcesFiles/TestSimpleFileflat.txt"));

        System.out.println(ffpmSimple.toString());
              

utilisation écriture

        
        /**
         * écriture d'un fichier à partir de l'objet
         */
        
        File fileReecrir = new File("RessourcesFiles/TestecrirNormanlFileflat.txt") ;
        
        Marshaller marshaller = JAFFBContext.newInstance().createMarshaller() ;
        
        marshaller.marshal(ffpmSimple, fileReecrir);
        
        /**
         * écriture d'un fichier à partir d'un objet
         * en utilisant la désactivation de certains attributs
         * 
         */
        
        File fileDesactivat = new File("RessourcesFiles/TestecrirDesactivatFileflat.txt") ;
        
        marshaller = JAFFBContext.newInstance().createMarshaller() ;
        
        Properties desactivate = new Properties();
        desactivate.put("refference", "refference");
        desactivate.put("valueRef", "valueRef");
        desactivate.put("idLigne", "idLigne");
        
        ffpmDesactivate.setDesactivat(desactivate);
        ffpmDesactivate.parsingPositional(ffpmSimple, fileDesactivat);
        
        marshaller.setDesactivat(desactivate);
        marshaller.marshal(ffpmSimple, fileDesactivat);
        
        Files.readAllLines(fileDesactivat.toPath()).forEach(s -> System.out.println(s));
        
        
    

ou juste pour une chaine string

    String chaine = "002165224203        76B0A01BB0B0CB B0CWAB B0DAFB B0E0EB B0FBFB B0G0TB B0H04B B0JA0B B0K04B B0L00B B0MM0B B0NKUB B0P2LB B0RFXBDAB00CDDAD00CDDAE07CDDAF01CDDAG00CDDAI00CDDAJ01CDDAL33CDDAP0";
        /**
         * creation d'un simple objet à partir d'une chaine de caractères
         */
          JAFFBContext contex = JAFFBContext.newInstance() ;
        
        LigneSimple ligneSimple = (LigneSimple) contex.createUnmarshaller().convertStringChaineInObject(LigneSimple.class, chaine);
        
        System.out.println(ligneSimple.toString());
    

Pour le traitement CSV

code exemple la Class :

public class ObjectForCsvMapping {

    @CsvMappingParse(offset = 1)
    private String nom ;
    @CsvMappingParse(offset = 2)
    private String prenom ;
    @CsvMappingParse(offset = 3)
    @PositionalJavaTypeAdapter(value=DateConvertddMMyyyy.class)
    private Date dateNaissanse ;
    @CsvMappingParse(offset = 4)
    private Integer age ; 
    


    getters and setter {
    ....

juste pour une chaine string en Objet et inverse

        String data = "Nom;Prenom;05/10/2014;100;" ;

        JAFFBContext  jaffbContext = JAFFBContext.newInstance() ;
        Unmarshaller  unmarshaller = jaffbContext.createUnmarshaller();
        
        ObjectForCsvMapping csvMapping = (ObjectForCsvMapping)      unmarshaller.convertChaineCsvInObject(ObjectForCsvMapping.class, data, ";");
        
        System.out.println(csvMapping.toString());
        
        String result = jaffbContext.createMarshaller().convertObjectInChaineCsv(csvMapping, ";" );
        
        System.out.println(result);

juste pour un Objet en chaine string et contenant une ou des lists annotées, attention un object egale une chaine.

premier classe

public class CorpCsvAnnalyse {
    
    @CsvMappingParse(offset = 1)
    private String famille ;
    @CsvMappingParse(offset = 2)
    private String ut;
    @CsvMappingParse(offset = 4)
    private String ligne;
    @CsvMappingParse(offset = 3)
    private List<PeriodeCsvAnnalyse> periodes ;
    getters and setter {
    ....

Classe de la liste qui est aussi annotées

public class PeriodeCsvAnnalyse {
    
   @CsvMappingParse(offset = 1)
   private List<SemaineCsvAnalyse> semaines ;
    getters and setter {
    ....
    

Classe de la liste qui est aussi annotées

public class SemaineCsvAnalyse {

    @CsvMappingParse(offset = 1)
    private Integer quantiteForSemaine  ;
    
   getters and setter {
    ....
    
        CorpCsvAnnalyse corpCsvAnnalyse = new CorpCsvAnnalyse() ;
        
        // Ajout des valeurs
        ...
        //
        

      JAFFBContext  jaffbContext = JAFFBContext.newInstance() ;
      Marshaller parse = jaffbContext.createMarshaller();
      String chaine =  parse.convertObjectInChaineCsv(corpCsvAnnalyse, ";");
      System.out.println(chaine);

About

Process flat files parsing to object marshaller unmarshaller

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 2

  •  
  •  

Languages