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

R Discussion :

Faire une boucle sur du texte


Sujet :

R

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut Faire une boucle sur du texte
    Bonjour,

    Après avoir passé pas mal de temps à chercher en vain une réponse à ma question sur le net, j'ai décidé de combattre ma profonde timidité en m'inscrivant sur ce forum pour vous poser cette question.

    Je cherche à faire la même opération sur 400 imputs différents (des scénarios économiques) de même format (CSV, 20 000 lignes, 121 colonnes) pour obtenir 400 outputs différents. Je vous passe les différentes étapes de calculs qui ne sont pas au coeur du problème, le programme se présente ainsi :
    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
     
    # Prendre en imput l'un des 400 fichiers CSV
    Outil <- as.matrix(read.table("EntreeOutil.csv", nrows = 20000, sep=",")) 
     
    # Faire les différentes opérations sur l'outil
    for (i in 1:500){
    	...
    	for (t in 1:121){
    		...
    		for (j in 1:40){
    			...
    		}
    		...
    	}
    }
    M = rbind(X, Y) # (X et Y étant obtenus lors des étapes de calcul précédentes)
    write.table(M,file="SortieOutil.csv",sep=",",col.names = FALSE,row.names = FALSE)
    Je voudrais donc faire cela pour mes 400 imputs (de noms différents) pour obtenir 400 outputs (de noms différents) mais je ne vois pas comment faire. J'ai exploré quelques pistes comme la fonction "list.files" qui permet de lister le nom de mes 400 fichiers en imputs, sans réussite hélas.

    N'hésitez pas à me poser des questions si mon problème est mal expliqué.

    Merci d'avance pour vos réponses.

    FLR007

  2. #2
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Bonjour,

    Et bien je salue ton audace et te remercie de nous rejoindre

    J'ai utilisé une fonction qui faisait plus ou moins cela, je devais parcourir quelques centaines de fichiers pour en extraire une partie et la stocker dans un fichier de sortie différent. Voilà en gros ce que ça donnait :

    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
    #Choix du répertoire où sont stockés les fichiers en inputs
    dossier_source <- choose.dir()
    setwd(dossier_source)#on se place dans ce dossier
    vec_fichiers <- list.files(path=".", pattern=".txt$")#on en liste les fichiers d'extension .txt
     
    for(i in 1:length(vec_fichiers)){#pour chaque nom de fichiers dans le vecteur
       contenu_fichier <- read.table(vec_fichiers[i], header=T, sep=";",quote="'\"",encoding="UTF-8")#on le lit
    #   ...(suite de traitement)
     
       if(file.exists(paste(getwd(),"/outputs",sep="")) == F){
          dir.create(paste(getwd(),"/outputs",sep=""))
       }
     
       setwd(paste(getwd(),"/outputs",sep=""))#On se place dans le dossier outputs (crée s'il n'existait pas)
       write.table(contenu_fichier, file=paste(getwd(),"/output",i,".txt",sep=""),sep="µ")#On stocke l'output dans un objet appelé output1 ou output2, ainsi de suite.
     
    }
    Voilà, j'espère que ça t'aidera un peu.

    À bientôt.

    Guinue

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Salut Guinue,

    Merci pour ta réponse, ta solution me parait bien adaptée. J'essaie ça au plus vite, je posterai pour vous tenir au courant de l'avancée.

    FLR007

  4. #4
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Septembre 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Finance

    Informations forums :
    Inscription : Septembre 2012
    Messages : 3
    Points : 3
    Points
    3
    Par défaut
    Après avoir adapté puis testé le code fourni par Guinue, mon problème est résolu. Voici un compte rendu point par point :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    dossier_source <- choose.dir()
    Très pratique pour ne pas avoir à choisir manuellement le chemin, merci pour cette astuce!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Outil <- as.matrix(read.table(vec_fichiers[k], sep=","))
    J'ai adapté et simplifié à mes besoins.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(file.exists(paste(getwd(),"/outputs",sep="")) == F){
        dir.create(paste(getwd(),"/outputs",sep=""))
    }
     
    setwd(paste(getwd(),"/outputs",sep=""))
    Ne marchait pas dans ma boucle, je ne me suis pas pris la tête, j'ai supprimé cette partie et suis resté dans le répertoire des imputs

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    write.table(M, file=paste(getwd(),"/output",vec_fichiers[k],sep=""),sep=",",col.names = FALSE,row.names = FALSE)
    Ici j'ai gardé le nom original de mes fichiers en rajoutant "output" devant pour pouvoir savoir quel output correspond à quel input.


    J'ai testé sur trois itérations, il ne me reste plus qu'à le faire sur plus de 400.

    Merci encore Guinue, mon problème est donc résolu, j'espère que ce thread sera utile à d'autres personnes rencontrant le même problème que moi.

    A bientôt,

    FLR007

  5. #5
    Membre habitué
    Homme Profil pro
    Analyste
    Inscrit en
    Février 2012
    Messages
    62
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Analyste

    Informations forums :
    Inscription : Février 2012
    Messages : 62
    Points : 143
    Points
    143
    Par défaut
    Franchement, de rien, c'était un plaisir.

    Effectivement il y a une astuce pour le if(file.exists()), il faut lancer R en tant qu'administrateur, sinon windows (7 en tout cas) empêche R de traficoter avec les dossiers.

    Voilà!

    A bientôt peut être.

    Guinue

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

Discussions similaires

  1. Comment faire une boucle sur handles.text(i)
    Par beloboy dans le forum Interfaces Graphiques
    Réponses: 1
    Dernier message: 09/01/2014, 22h53
  2. [XSLT] Faire une boucle sur une variable [i]
    Par PoT_de_NuTeLLa dans le forum XSL/XSLT/XPATH
    Réponses: 8
    Dernier message: 07/06/2010, 12h45
  3. [phpBB][2] Faire une boucle sur plusieurs colonnes
    Par Vinuto dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 28/09/2007, 10h45
  4. faire une boucle sur un select
    Par reski dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/03/2006, 19h41

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