Lecture de gros fichiers CSV sur Android

Lecture de gros fichiers CSV sur Android - Java - Programmation

Marsh Posté le 24-02-2012 à 23:34:25    

Bonsoir à tous !
 
Alors voila, je cherche à lire de gros fichiers CSV sur un terminal android. Ca a l'air trivial comme ca, mais un téléphone est beaucoup plus lent qu'un PC, et je n'arrive pas à trouver un moyen d'optimiser le temps de lecture...
 
Pour info, je cherche à lire un "petit" fichier pour l'instant (8000 lignes / 20 colonnes), qui représente ~2Mo. Mon programme actuel converti (en gros) mon fichier en List<String[]>. Cette opération dure en moyenne 160 ms en application Java 1.6 (mode release), mais presque 4 secondes en mode application Android sur mon HTC Desire (mode release egallement).
 
Quelqu'un connaitrait-il un autre moyen, rapide et efficace, de lire mon fichier pour obtenir des String[] (ou eventuellement des List<String> ) ? Le but étant par la suite de remplir des objets :)
 
Voici mon code actuel (un peu tronqué) :
 

Code :
  1. public class CFichierTabule {
  2.   //~~~~~~~~~~ Attributs ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  3.     // Séparateur utilisé pour lire / écrire le fichier tabulé
  4.     private char m_Separateur = '\t';
  5.    
  6.     private boolean m_ChargementOK = false;
  7.  
  8.   //~~~~~~~~~~ Méthodes publiques ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  9.     // Constructeur de la classe CFichierTabule
  10.     public CFichierTabule (String CheminFichier) {
  11.       List<String> ContenuFichier = LireFichier (CheminFichier);
  12.    
  13.       if (ContenuFichier == null || ContenuFichier.size() == 0)
  14.         return;
  15.      
  16.       List<String[]> ListeEnregistrementsString = ObtenirEnregistrementsString (ContenuFichier);
  17.       //(...)
  18.       m_ChargementOK = true;
  19.     } 
  20.  
  21.  
  22.  
  23.   //~~~~~~~~~~ Méthodes privées ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  24.     // Parcours le fichier et renvois son contenu sous forme de liste de Strings
  25.     private List<String> LireFichier (String CheminFichier) {
  26.       List<String> ContenuFichier = null;
  27.      
  28.       try {
  29.         File Fichier = new File (CheminFichier);
  30.         if (!Fichier.exists())
  31.             return null;
  32.        
  33.         FileReader Lecteur    = new FileReader (Fichier);
  34.         BufferedReader Buffer = new BufferedReader (Lecteur);
  35.      
  36.         ContenuFichier = new ArrayList<String>();
  37.      
  38.         String LigneLue;
  39.         while ((LigneLue = Buffer.readLine()) != null) {
  40.           ContenuFichier.add(LigneLue.trim());
  41.         }         
  42.         Lecteur.close();
  43.         Buffer.close();
  44.       } catch (Exception e) {
  45.         // TODO Auto-generated catch block
  46.         e.printStackTrace();
  47.       }
  48.      
  49.       return ContenuFichier;
  50.     }
  51.    
  52.     //----------------------------------------------------------------------------------------------
  53.    
  54.     // Converti une liste de Strings en liste de String[]
  55.     private List<String[]> ObtenirEnregistrementsString (List<String> ContenuFichier) {
  56.       String Separateur = new Character (m_Separateur).toString();
  57.      
  58.       int NbEnregistrements = ContenuFichier.size();
  59.       List<String[]> ListeEnregistrementsString = new ArrayList<String[]> (NbEnregistrements);
  60.      
  61.       //@ HFR : Je saute la première ligne car c'est les entêtes, et qu'elles sont traitées à part
  62.       for (int IEnregistrement = 1 ; IEnregistrement < NbEnregistrements ; IEnregistrement++) {
  63.         String LigneFichier = ContenuFichier.get(IEnregistrement);       
  64.         ListeEnregistrementsString.add (LigneFichier.split(Separateur));
  65.       }
  66.      
  67.       return ListeEnregistrementsString;
  68.     }
  69. }


 
Je remercie d'avance toute personne qui pourra m'apporter ses lumières  [:shimay:1]  
 
Edit : Soyez tolérants, maîtres incontestés de Java qui lirez mon message ! Je débute dans ce langage, j'ai quelques lointaines bases remontant à l'école, et j'ai toujours fait que du C++. J'essaye de me mettre à ce langage que je trouve intéressant, donc si vous voyez de grosses bourdes de naab en Java, mes excuses !
 
 
 
Edit : Ajout de "Android" dans le titre, c'est plus parlant ;)


Message édité par Profil supprimé le 24-02-2012 à 23:40:32
Reply

Marsh Posté le 24-02-2012 à 23:34:25   

Reply

Marsh Posté le 24-02-2012 à 23:48:47    

Est ce que tu n'as pas interet a charger se fichier dans une base sqllite locale que tu interrogeras au besoin ?  
Tout charger en mémoire à de toute façon un coût important

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed