Bonjour
Comment lire un fichier texte qui comporte des lignes vides car la méthode readline() me retourne:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
alors que la ligne suivante n'est pas vide.
Merci d'avance
Version imprimable
Bonjour
Comment lire un fichier texte qui comporte des lignes vides car la méthode readline() me retourne:
java.lang.StringIndexOutOfBoundsException: String index out of range: -1
alors que la ligne suivante n'est pas vide.
Merci d'avance
il faudrait que tu nous montre ton code car le parcour d'un fichier jusqu'a EOF ne doit pas fournir se type d'exception...
Le voici
merci pour la promptitude
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62 public class Flux_1 { public static void main(Statement stmt, String fichier, String[] val) { String nom_tbl = val[2]; String sep_chp = val[3]; String titre_col = val[4]; String def_tbl = val[6]; String[] num_chp = val[7].split("[|]"); Integer nb_chp = 0; String sql = ""; String valeur = ""; StringBuffer sql0 = new StringBuffer(); //System.out.println(val[8]); if(val[8].equals("no_concat")) { try{stmt.execute("TRUNCATE TABLE `"+nom_tbl+"`");}catch(final SQLException e){} if(nom_tbl.equals("f_emat")) {librairie.Init_tbl_import.f_emat(stmt);} if(nom_tbl.equals("f_matart")) {librairie.Init_tbl_import.f_matart(stmt);} if(nom_tbl.equals("t_detdep")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("t_invgen")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("t_invgendet")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("t_matnom")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("t_matref")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("compta")) {librairie.Init_tbl_import.simat_it(stmt);} if(nom_tbl.equals("result_h")) {librairie.Init_tbl_import.simat_it(stmt);} } try {InputStream ips=new FileInputStream(fichier); InputStreamReader ipsr=new InputStreamReader(ips); BufferedReader br=new BufferedReader(ipsr); String ligne; //lecture ligne à ligne while ((ligne=br.readLine())!=null) {//nbre de colonnes dans le fichier importé if(ligne.split("["+sep_chp+"]").length > nb_chp){nb_chp = ligne.split("["+sep_chp+"]").length;} sql0 = new StringBuffer("INSERT INTO "+nom_tbl+" VALUES ( "); //découpage de la ligne suivant le séparateur SEP_CHP //si la ligne finit par le séparateur on ajoute " " if(ligne.substring(ligne.length()-1, ligne.length()).equals(sep_chp))ligne=ligne+" "; //découpage val = ligne.split("["+sep_chp+"]", 0); //si la taille de val < nb_chp -> ligne avec retour chariot on concatène avec la ligne suivante while(val.length<nb_chp) {ligne += br.readLine(); val = ligne.split("["+sep_chp+"]", 0);} //extraction et construction de la rqte d'insertion for(int i=0;i<num_chp.length;i++) {valeur = val[Integer.parseInt(num_chp[i], 10)-1]; //System.out.println(num_chp[i]+" - "+valeur); if(valeur.equals("")||valeur.equals(" ")){valeur = "NULL ,";}else{valeur = "'"+valeur+"' ,";} sql0 = sql0.append(valeur);} sql = sql0.substring(0, (sql0.length()-1))+")"; //insertion try{stmt.execute(sql);}catch(final SQLException e){} System.out.println("Sql: "+sql); } br.close(); } catch (Exception e) {System.out.println("popo:"+e.toString());} } }
L'exception est levée sur quelle ligne ? ( je doute fortement que se soit sur le readline... )
Tu es sûr que ton Exception est levée à la ligne
?Code:
1
2 while ((ligne=br.readLine())!=null)
Edit : tiens lol même réflexion que iohack ^^
sur la ligne qui suit el while
et les lignes lues sont de la forme:Code:
1
2
3
4 while(val.length<nb_chp) {ligne += br.readLine(); val = ligne.split("["+sep_chp+"]", 0);}
12545896;UTIL;19991201;347002;F;I;;00;N;;;VALISE;20;OUTILLAGE;;VALISE
;;;;0;;;M;;;;;;;;C;;;;;;#;
Tu peux nous donner la stack complète de l'exception ?
Au lieu de faire
faisCode:
1
2 catch (Exception e) {System.out.println("popo:"+e.toString());}
Code:
1
2
3
4
5
6 catch (Exception e) { System.err.print("popo:"); e.printStackTrace(); System.err.println() }
Merci pour le code
Finalement c'était la ligne
qui causait le pb. En décortiquant l'extraction une ligne vide est retournée causant l'erreur alors qu'elle ne devrait pas l'être suite à analyse du fichier. En déplaçant la ligne de code après le while, pb résolu.Code:
1
2 if(ligne.substring(ligne.length()-1, ligne.length()).equals(sep_chp))ligne=ligne+" ";