Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1377 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  Lecture de gros fichiers CSV sur Android

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Lecture de gros fichiers CSV sur Android

n°2128358
Profil sup​primé
Posté le 24-02-2012 à 23:34:25  answer
 

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
mood
Publicité
Posté le 24-02-2012 à 23:34:25  profilanswer
 

n°2128359
flo850
moi je
Posté le 24-02-2012 à 23:48:47  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  Lecture de gros fichiers CSV sur Android

 

Sujets relatifs
Compilation parser XML pour intégration à un code CProblème de lecture du CSS sous IE
Souci de fichiers introuvablescherche logiciel de consultation de fichiers multiformats
Lecture et recopie d'une matrice depuis un fichier texteErreur lors de la lecture de gros fichiers sur réseau local
Lecture sur un port réseau[C] problème de fichiers
Plus de sujets relatifs à : Lecture de gros fichiers CSV sur Android


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR