Parser un fichier csv ou txt pour obtenir un tableau

Aller en bas

Parser un fichier csv ou txt pour obtenir un tableau Empty Parser un fichier csv ou txt pour obtenir un tableau

Message  Gus le Jeu 28 Juil - 10:58

Quand on souhaite exporter un tableau Excel au format texte pour ensuite pouvoir exploiter les données dans un programme Java, on a le choix entre deux formats qui sont :

  1. Le format CSV (séparateur:point-virgule)
  2. Le format TXT (séparateur:tabulation)

Pour ensuite exploiter en Java les tableaux de texte stockés dans ces fichiers, il ne suffit de les lire mais il faut aussi les parser, c'est à dire analyser leur structure pour reconstituer les données. Je vous présente dans ce post deux entités de transformation String -> String[][] qui prennent respectivement en entré les contenus des deux types de fichier CSV et TXT pour renvoyer en sortie les tableaux String[][] correspondants.

Ces deux entités sont à vrai dire quasiment identiques à un détail près : la constante CHAR_DELIM

gus.file.convert.csv.parser
Code:
package gus05.entity.gus.file.convert.csv.parser;

import gus05.framework.core.Entity;
import gus05.framework.features.Transform;


public class CsvParser implements Entity, Transform
{
    public String getName()            {return "gus.file.convert.csv.parser";}
    public String getCreationDate()      {return "2006.07.15";}
   

    public static char CHAR_DELIM = ';';
   
    public static String delim_line = "@@<@@LINE@@>@@";
    public static String delim_elem = "@@<@@ELEM@@>@@";

   
   
    public Object transform(Object obj) throws Exception
    {
        String in = formatInput(obj.toString());
       
        String[] a = in.split(delim_line,-1);
        int nb_lines = a.length;
       
        int nb_elems = 0;
        for(int i=0;i<nb_lines;i++)
        {
            int w = a[i].split(delim_elem,-1).length;
            nb_elems = Math.max(nb_elems,w);
        }
       
        if(nb_lines==0)throw new Exception("no line delimiters found");
        if(nb_elems==0)throw new Exception("no elements delimiters found");
       
        String[][] result = new String[nb_lines][nb_elems];
        for(int i=0;i<nb_lines;i++)
        for(int j=0;j<nb_elems;j++)
        result[i][j]="";
           
        for(int i=0;i<nb_lines;i++)
        {
            String[] n = a[i].split(delim_elem,-1);
            for(int j=0;j<n.length;j++)
            result[i][j]=n[j];
        }
        return result;
    }
   
    // parsing code
   
    private int situation;
   
    private String formatInput(String in)
    {
        StringBuffer out = new StringBuffer();
        situation = 0;
       
        for(int i=0;i<in.length();i++)
        perform_FormatInput(out,in,in.charAt(i),i);
        return out.toString();
    }
   
    private void perform_FormatInput(StringBuffer out, String in, char c,int index)
    {
        switch(situation)
        {
            case 0: 
            if(c=='"'){situation=1;break;}
            if(c==CHAR_DELIM){out.append(delim_elem);break;}
            if(c=='\n'){out.append(delim_line);break;}
            if(c=='\r'){break;}
            out.append(c);
            break;

            case 1:
            if(c=='"'){situation=2;break;}
            out.append(c);
            break;

            case 2:
            if(c=='"'){situation=1;out.append('"');break;}

            situation=0;
            if(c==CHAR_DELIM){out.append(delim_elem);break;}
            if(c=='\n'){out.append(delim_line);break;}
            if(c=='\r'){break;}
            out.append(c);
            break;
        }
    }
}

gus.file.convert.tab.parser
Code:
package gus05.entity.gus.file.convert.tab.parser;

import gus05.framework.core.Entity;
import gus05.framework.features.Transform;


public class TabParser implements Entity, Transform
{
    public String getName()            {return "gus.file.convert.tab.parser";}
    public String getCreationDate()      {return "2006.10.02";}
   

    public static char CHAR_DELIM = '\t';

    public static String delim_line = "@@<@@LINE@@>@@";
    public static String delim_elem = "@@<@@ELEM@@>@@";
   
   
   
    public Object transform(Object obj) throws Exception
    {
        String in = formatInput(obj.toString());
       
        String[] a = in.split(delim_line,-1);
        int nb_lines = a.length;
       
        int nb_elems = 0;
        for(int i=0;i<nb_lines;i++)
        {
            int w = a[i].split(delim_elem,-1).length;
            nb_elems = Math.max(nb_elems,w);
        }
       
        if(nb_lines==0)throw new Exception("no line delimiters found");
        if(nb_elems==0)throw new Exception("no elements delimiters found");
       
        String[][] result = new String[nb_lines][nb_elems];
        for(int i=0;i<nb_lines;i++)
        for(int j=0;j<nb_elems;j++)
        result[i][j]="";
           
        for(int i=0;i<nb_lines;i++)
        {
            String[] n = a[i].split(delim_elem,-1);
            for(int j=0;j<n.length;j++)
            result[i][j]=n[j];
        }
        return result;
    }
   
   
    // parsing code
   
    private int situation;
   
    private String formatInput(String in)
    {
        StringBuffer out = new StringBuffer();
        situation = 0;
       
        for(int i=0;i<in.length();i++)
        perform_FormatInput(out,in,in.charAt(i),i);
        return out.toString();
    }
   
    private void perform_FormatInput(StringBuffer out, String in, char c,int index)
    {
        switch(situation)
        {
            case 0: 
            if(c=='"'){situation=1;break;}
            if(c==CHAR_DELIM){out.append(delim_elem);break;}
            if(c=='\n'){out.append(delim_line);break;}
            if(c=='\r'){break;}
            out.append(c);
            break;

            case 1:
            if(c=='"'){situation=2;break;}
            out.append(c);
            break;

            case 2:
            if(c=='"'){situation=1;out.append('"');break;}

            situation=0;
            if(c==CHAR_DELIM){out.append(delim_elem);break;}
            if(c=='\n'){out.append(delim_line);break;}
            if(c=='\r'){break;}
            out.append(c);
            break;
        }
    }
}
Gus
Gus
Admin

Messages : 249
Date d'inscription : 01/09/2009

Voir le profil de l'utilisateur http://www.gus05.com

Revenir en haut Aller en bas

Revenir en haut


 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum