Parser un fichier csv ou txt pour obtenir un tableau
Projet gus05 de développement Java :: Chantiers :: Chantiers techniques :: Traitement des données :: Parseurs de fichiers texte
Page 1 sur 1
Parser un fichier csv ou txt pour obtenir un tableau
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 :
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
gus.file.convert.tab.parser
- Le format CSV (séparateur:point-virgule)
- 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;
}
}
}
Projet gus05 de développement Java :: Chantiers :: Chantiers techniques :: Traitement des données :: Parseurs de fichiers texte
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Mar 16 Sep - 12:01 par Gus
» Présentation du jeu Vindinium
Jeu 20 Fév - 15:32 par Gus
» Rechercher la cible la plus proche avec le "Breadth First Search"
Jeu 20 Fév - 13:06 par Gus
» Impression d'écran avec sélection de zone
Jeu 20 Fév - 12:12 par Gus
» Envoyer un mail par un compte Gmail
Jeu 25 Avr - 14:04 par Gus
» Streaming : comment télécharger les vidéos
Lun 4 Fév - 19:59 par Gus
» Synology : installer ipkg
Mar 22 Jan - 21:22 par Gus
» Trouver le type de lecteur avec JNA
Mer 9 Jan - 23:11 par Gus
» Adresse ip publique et adresse ip privée, Internet box et UPnP
Mer 9 Jan - 21:02 par Gus
» Accéder au numéro de série du lecteur par un script vb
Mer 9 Jan - 19:31 par Gus