IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Extraire un sous fichier à partir d'un fichier texte


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut Extraire un sous fichier à partir d'un fichier texte
    Bonjour tout le monde,

    J'ai un fichier texte et je voudrais extraire seulement 15% des données afin d'exécuter qulques traitements sur ces derniers. La taille de mon fichier est assez importante. Peu importe pour l'extarction à partir de debut ou au milieu du fichier.
    je pense à commencer par compter le nombre de ligne de mon fichier (chaque ligne contient un mot). NB
    puis je calcule le pourcentage P= (NB*15/100)

    Porriez vous m'aider à trouver la fonction adéquate à fin de commencer l'extraction des donnée (ligne par ligne ) tout en réspéctant la taille P.
    Si c'est faidable en java.
    Merci.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Si le but est de ne pas charger tout le fichier en mémoire, il faut
    1. Lire le fichier ligne par ligne une première fois pour compter les lignes, puis prendre les 15% au début (c'est le plus simple)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      	public void extrairePourcentage(Path in, Path out, int percent) throws IOException {
       
      		int total=0;
      		try(BufferedReader reader = Files.newBufferedReader(in) ) {
      			for(String line=reader.readLine(); line!=null; line=reader.readLine()) {
      				total++;
      			}
      		}
      		int nb=(int)(total*percent/100F);
      		try(BufferedWriter writer = Files.newBufferedWriter(out);
      			BufferedReader reader = Files.newBufferedReader(in); ) {
      			for(String line=reader.readLine(); line!=null && nb>0; line=reader.readLine()) {
      				writer.write(line);
      				writer.newLine();
      				nb--;
      			}
      		}
       
      	}
    2. Sinon, on peut tout charger en mémoire et ne prendre que 15% (ici, on peut prendre plus facilement à partir de n'importe quelle ligne (telle qu'il y ait au moins 15% des lignes après)
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      public void extrairePourcentage(Path in, Path out, int percent) throws IOException {
      		List<String> all = Files.readAllLines(in);
      		int nb=(int)(all.size()*percent/100F);
      		try(BufferedWriter writer = Files.newBufferedWriter(out)) {
      			for(String line : all.subList(0, nb) ) { // 0 c'est pour commencer au début, mais cette valeur peut être comprise entre 0 et (all.size()-nb)
      				writer.write(line);
      				writer.newLine();
      			}
      		}
      	}
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Merci beaucoup ,

    J'ai utilisé la première , c'est plus rapide puisque j'ai besoin de charger seulement les 15 % du texte et non pas tout le fichier.

    Par la suite du traitement, je vais parcourir le fichier resultat "out" par Scanner .Si je veux que ma fontion "extrairePourcentage" retourne Scanner . Est-ce je peux convertir mon resultat de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public static void extrairePourcentage(Path in, Path out, int percent) throws IOException { }
    to:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public static Scanner extrairePourcentage(Path in, Path out, int percent) throws IOException {}
    Au niveau de la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
     public static Scanner extrairePourcentage(Path in, Path out, int percent) throws IOException {
     
    		int total=0;
    		try(BufferedReader reader = Files.newBufferedReader(in) ) {
    			for(String line=reader.readLine(); line!=null; line=reader.readLine()) {
    				total++;
    			}
    		}
    		int nb=(int)(total*percent/100F);
    		try(BufferedWriter writer = Files.newBufferedWriter(out);
    			BufferedReader reader = Files.newBufferedReader(in); ) {
    			for(String line=reader.readLine(); line!=null && nb>0; line=reader.readLine()) {
    				writer.write(line);
    				writer.newLine();
    				nb--;
    			}
     
    		}
                Scanner sc = new Scanner((out));  
                return sc;
    	}
    et au niveau main , je fais l'appel de cette manière :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Scanner sc = extrairePourcentage(in, out, 15);
    Est ce que c'est faisable ?

    Merci

  4. #4
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Oui, c'est faisable (pourquoi ne pas essayer toi-même). N'oublie pas de fermer le Scanner quand tu n'en sers plus.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try(Scanner scanner = extrairePourcentage(in, out, 15)) {
    //traitement ici
    }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  5. #5
    Membre très actif
    Femme Profil pro
    Étudiant
    Inscrit en
    Novembre 2012
    Messages
    181
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Novembre 2012
    Messages : 181
    Par défaut
    Rebonjour

    Oui Merci, c'est fait , sauf que mon fichier est un peu lourd , il contient 9000 lignes d'ou le temps d'exécution :
    Nom : 1.PNG
Affichages : 273
Taille : 1,7 Ko
    Je voudrais savoir ou je ferme le scanner ? peut-être que ça va raccourcir le temps d'exécution

    Merci

  6. #6
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par cheyma Voir le message
    Je voudrais savoir ou je ferme le scanner ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    try(Scanner scanner = extrairePourcentage(in, out, 15)) {
    //traitement ici
    }
    Cette structure dite "try-with-resource" ferme juste automatiquement le Scanner à la fin du bloc.

    Citation Envoyé par cheyma Voir le message
    peut-être que ça va raccourcir le temps d'exécution
    Non, le fermer ne changera rien au temps d'exécution. C'est juste pour libérer proprement le fichier.

    Montre-moi ton code de traitement. Le temps d'exécution que tu donnes, c'est pour le traitement des 15%, ou le traitement total ?

    Essaye par ailleurs de remplacer le comptage des lignes par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int total=0;
    try(LineNumberReader reader = new LineNumberReader(Files.newBufferedReader(in)) ) {
        reader.skip(Files.size(in));
        total=reader.getLineNumber();
    }
    Ça devrait déjà permettre de gagner sur le comptage.
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2007] Implémentation des tables sous Access à partir d'un fichier EXCEL
    Par SOFIC dans le forum VBA Access
    Réponses: 1
    Dernier message: 14/06/2015, 09h10
  2. Itérer dans un sous job à partir d'un fichier
    Par n.roussaly dans le forum Développement de jobs
    Réponses: 0
    Dernier message: 03/05/2011, 18h03
  3. Réponses: 1
    Dernier message: 24/01/2008, 14h19
  4. Réponses: 4
    Dernier message: 31/07/2006, 10h31
  5. Générer plusieurs fichiers à partir d'un fichier excel
    Par yas2006 dans le forum Documents
    Réponses: 3
    Dernier message: 02/06/2006, 18h54

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo