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 :

Problème d'ouverture de fichiers.txt... fichier inexistant : comment passer au suivant ?


Sujet :

R

  1. #1
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Problème d'ouverture de fichiers.txt... fichier inexistant : comment passer au suivant ?
    Bonjour à tous,

    Voilà j'ai un petit soucis. J'ai écris un script qui me génère tout un ensemble de noms de fichiers et j'aimerais lire seulement ceux qui existent. Malheureusement, R bloque sur le premier nom de fichier qui n'existe pas. Comment passer au nom suivant ? Je suis débutant sur R...

    Voici mon code :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    ##### Generation de 18 600 noms de fichiers
     
    name<-c('r1','r2','r3','r4','r5','r6','r7','r8','r9','r10')
    name2<-rep(name, times=31)
    day<-c('01','02','03','04','05','06','07','08','09',10:31)
    month<-c('01','02','03','04','05','06','07','08','09',10,11,12)
    year<-c(10:15)
     
    nameday<-paste(name2,day,sep="s")
    nameday2<-rep(nameday, times=(length(month)))
     
    namedaymonth<-paste(nameday2,month,sep="")
    namedaymonth2<-rep(namedaymonth,times=(length(year)-1))
     
    NDMY<-paste(namedaymonth2,year,sep="")
    NDMY<-paste(NDMY,'.txt',sep="")
     
     
    ######Lecture des fichiers existant
     
    file<-c(NDMY)
    for (i in 1:length(NDMY)){
    	   data<-read.table(file[i])}
     
     
    Voici les erreurs :	  
     
    #Erreur dans file(file, "rt") : impossible d'ouvrir la connexion
    #De plus : Message d'avis :
    #In file(file, "rt") :
    #impossible d'ouvrir le fichier 'r1s010110.txt' : No such file or directory
    Est-ce que quelqu'un saurait m'aider ?

    Merci d'avance

  2. #2
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 339
    Points
    339
    Par défaut
    Bonsoir,

    Voici déjà un début d'idée de solution.
    Pour avoir la liste des fichiers d'un répertoire, il faut utiliser dir().
    Avant de faire le read.table(file[i]), il faudrait donc vérifier (via %in%) si file[i] est bien dans la liste des fichiers de dir().
    Bien à vous

  3. #3
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup pour votre réponse

    Maintenant j'applique le code suivant :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    NDMY<-c('r2s010313.txt','r1s230412.txt')
     
    #Explorer le repertoire source
     
    a<-dir()
     
    #Ouvrir seulement les fichiers contenus dans le répertoire source
     
    l<-c(1:length(NDMY))#De 1 à 2, j'ai fait simple...
     
    for (i in l){
       if (file[i]%in%a==TRUE){
       	  #print(file[i])}} Affiche bien les 2 fichiers
              read.table(file[i])}} #N'ouvre que le dernier fichier...

    Mais comme l'indique mon commentaire, seule la fonction "print" affiche les 2 noms de fichiers alors que la fonction "read.table" n'ouvre que le dernier des 2 fichiers... Pourquoi dans un cas "i" est une liste et dans l'autre cas un seul chiffre ?

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Août 2007
    Messages
    125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2007
    Messages : 125
    Points : 339
    Points
    339
    Par défaut
    Bonjour,
    voir le commentaire dans le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    NDMY<-c('r2s010313.txt','r1s230412.txt')
    a<-dir()
    l<-c(1:length(NDMY))
    for (i in l){
    	if (file[i]%in%a==TRUE){
    		dd <- read.table(file[i])
    		# ici, la variable 'dd' contient le contenu du fichier et donc (par example) la commande print(dd) devrait fonctionner.
    	}
    }
    Bien à vous,

  5. #5
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    J'ai fait ce que vous m'avez proposé, car j'avais déjà testé mais de manière différente donc je me suis dit que ça pourrait peut-être marcher... Malheureusement, quand je tape le code suivant (en espérant ne pas avoir omis certaines parties) :

    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
    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
    NDMY<-c('r2s010313.txt','r1s230412.txt')
    a<-dir()
    l<-c(1:length(NDMY))
    for (i in l){
       if (file[i]%in%a==TRUE){
       	  dd<-read.table(file[i])
       }
    } 
    c<-print(dd)
     
     
    #Le nom de mon script qui correspond au code ci-dessus
    > source("/Users/emmanuelbreysse/test2.R") 
    #Le fichier  qui s'ouvre est seulement le second :
     
              x
    1      0.00
    2      0.00
    3      0.00
    4      0.00
    5        NA
    6        NA
    7      0.00
    8      0.00
    9      0.00
    10       NA
    11       NA
    12   382.86
    13    10.05
    14   444.29
    15    11.58
    16   516.76
    17    17.16
    18       NA
    19       NA
    20   313.82
    21    22.78
    22   288.33
    23    20.73
    24       NA
    25       NA
    26  1417.64
    27   206.85
    28  1113.00
    29    25.82
    30       NA
    31       NA
    32 23568.00
    33   107.37
    34  6625.08
    35   107.37
     
    #Et le message d'erreur :
     
    "Message d'avis :
    In readLines(file) :
      ligne finale incomplète trouvée dans '/Users/emmanuelbreysse/test2.R'"
    Je ne comprends pas pourquoi le script ouvre tout seul mon fichier txt, il n'en n'a pas l'instruction. J'ai essayé en effaçant la mémoire de la console de R avec "remove", sans résultat.

    Quand je fais ensuite "c", R m'ouvre le même fichier :

    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
    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
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    > c
              x
    1      0.00
    2      0.00
    3      0.00
    4      0.00
    5        NA
    6        NA
    7      0.00
    8      0.00
    9      0.00
    10       NA
    11       NA
    12   382.86
    13    10.05
    14   444.29
    15    11.58
    16   516.76
    17    17.16
    18       NA
    19       NA
    20   313.82
    21    22.78
    22   288.33
    23    20.73
    24       NA
    25       NA
    26  1417.64
    27   206.85
    28  1113.00
    29    25.82
    30       NA
    31       NA
    32 23568.00
    33   107.37
    34  6625.08
    35   107.37
     
    #J'ai vérifié le vecteur "l",  "i", puis "file[i]" de "1" et de "2", et enfin "dd" :
     
    > l
    [1] 1 2
     
    > i
    [1] 2
     
    > file[i]
    [1] "r1s230412.txt"
     
    > file[1]
    [1] "r2s010313.txt"
     
    > file[2]
    [1] "r1s230412.txt"
     
    > dd
              x
    1      0.00
    2      0.00
    3      0.00
    4      0.00
    5        NA
    6        NA
    7      0.00
    8      0.00
    9      0.00
    10       NA
    11       NA
    12   382.86
    13    10.05
    14   444.29
    15    11.58
    16   516.76
    17    17.16
    18       NA
    19       NA
    20   313.82
    21    22.78
    22   288.33
    23    20.73
    24       NA
    25       NA
    26  1417.64
    27   206.85
    28  1113.00
    29    25.82
    30       NA
    31       NA
    32 23568.00
    33   107.37
    34  6625.08
    35   107.37
    #Est-ce normal que "i" ait une longueur de 1 ? Je suppose que R écrase la première valeur "i" dans sa mémoire et la remplace ensuite par "2"... Mais pourquoi n'ouvre-t-il pas le contenu de "file[1]" ? Je pense qu'il y a un problème dans ma boucle, mais je suis incapable de le trouver...

  6. #6
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Je pense que j'ai trouvé une solution, mais je ne la comprends pas ^^"

    Je fais une première boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    file<-c('r2s010313.txt','r1s230412.txt')
    a<-dir()
    l<-c(1:length(file))
     
    for (i in l){
          if (file[i]%in%a==TRUE){
       	    dd<-read.table(file[i],sep=",")
       }
    }
    Puis une seconde :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (i in l){
          if (file[i]%in%a==TRUE){
       	    dd[[i]]<-read.table(file[i],sep=",")
       }
    }

    Et là j'obtiens ça :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    Message d'avis :
    In readLines(file) :
      ligne finale incomplète trouvée dans '/Users/emmanuelbreysse/test2.R'
     
    > dd
            x        x
    1    0.00     0.00
    2    0.00     0.00
    3    0.00     0.00
    4    0.00     0.00
    5      NA       NA
    6      NA       NA
    7    0.00     0.00
    8    0.00     0.00
    9    0.00     0.00
    10     NA       NA
    11     NA       NA
    12     NA   382.86
    13     NA    10.05
    14     NA   444.29
    15     NA    11.58
    16     NA   516.76
    17     NA    17.16
    18     NA       NA
    19     NA       NA
    20 534.80   313.82
    21  41.46    22.78
    22     NA   288.33
    23     NA    20.73
    24     NA       NA
    25     NA       NA
    26 883.60  1417.64
    27  20.57   206.85
    28     NA  1113.00
    29     NA    25.82
    30     NA       NA
    31     NA       NA
    32    Inf 23568.00
    33 197.17   107.37
    34 909.90  6625.08
    35 197.17   107.37
    Donc c'est le résultat que je souhaitais avoir... Mais je ne comprends absolument pas pourquoi je dois écrire "dd<-...", puis après "dd[[i]]<-..." ???
    J'ai essayé toutes les combinaisons et seule celle-ci fonctionne... Quelqu'un a-t-il une suggestion ?

  7. #7
    Membre confirmé
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Points : 486
    Points
    486
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    ## Jetez un oeil a cette fonction
    ?file.exists
     
    ## Si fichiers est le nom de votre vecteur de fichiers
    for (fichier in fichiers) {
      if (file.exists(fichier)) {
        data <- read.table(fichier)
      }
    }
    HTH

    Vincent

  8. #8
    Membre confirmé
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Points : 486
    Points
    486
    Par défaut
    Rebonjour,

    file<-c('r2s010313.txt','r1s230412.txt')
    a<-dir()
    l<-c(1:length(file))

    for (i in l){
    if (file[i]%in%a==TRUE){
    dd<-read.table(file[i],sep=",")
    }
    }
    Dans votre boucle initiale, le résultat de chaque nouvelle iteration read.table est affecté à dd et donc écrase le précédent.

    for (i in l){
    if (file[i]%in%a==TRUE){
    dd[[i]]<-read.table(file[i],sep=",")
    }
    }
    Un data.frame est une forme particulière de liste. Dans votre seconde boucle, chaque itération ajoute une colonne. Cela ne marche que parce que je suppose que vos fichiers ne contiennent chacun qu'une colonne.

    Si vous voulez obtenir un data.frame contenant une colonne pour chaque fichier qui existe dans votre répertoire, un truc dans ce gout la devrait faire l'affaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    ## Si fichiers est votre vecteur de fichiers
    resultats <- lapply(fichiers, function(fichier) {
      if (file.exists(fichier)) {
        temp <- read.table(fichier, sep=",")
        return(temp)
      } else {
        return(NA)
      }
    })
     
    resultats <- do.call(cbind, resultats)
    HTH

    Vincent

  9. #9
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci beaucoup Vincent, ça marche !

    Je dois maintenant digérer les 3 fonctions que vous utilisez et que je ne maitrise pas... Et réussir à enlever les colonnes de "NA"...

    Merci encore à vous deux

  10. #10
    Membre confirmé
    Homme Profil pro
    MCU
    Inscrit en
    Juillet 2010
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : MCU
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2010
    Messages : 185
    Points : 486
    Points
    486
    Par défaut
    Rebonjour,

    Pour éviter les colonnes de NA, vous pouvez utiliser le code suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    ## Si fichiers est votre vecteur de fichiers
    resultats <- lapply(fichiers, function(fichier) {
      if (file.exists(fichier)) {
        temp <- read.table(fichier, sep=",")
        temp$origine <- fichier
        return(temp)
      } else {
        return(NULL)
      }
    })
     
    resultats <- do.call(rbind, resultats)
    resultats <- reshape(resultats, v.names="x", timevar="origine", idvar="id", direction="wide")
    HTH

    Vincent

  11. #11
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut
    Merci,

    J'ai essayé ce code mais ça ne marche pas complètement. Dois-je redéfinir les variables de la fonction "reshape" ? J'obtiens ceci quand j'applique le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Erreur dans `[.data.frame`(data, , idvar) : 
      colonnes non définies sélectionnées"
    Mais j'ai alors une longue liste de valeurs avec le nom du fichier associé... Si je remplace rbind par cbind j'obtiens une autre erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "Erreur dans data.frame(..., check.names = FALSE) : 
      les arguments impliquent des nombres de lignes différents : 35, 0"

  12. #12
    Membre à l'essai
    Inscrit en
    Juillet 2012
    Messages
    17
    Détails du profil
    Informations forums :
    Inscription : Juillet 2012
    Messages : 17
    Points : 13
    Points
    13
    Par défaut Problème suppression de colonnes résolu
    Voilà j'ai réglé mon problème en bidouillant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    resultats <- lapply(fichiers, function(fichier) {
      if (file.exists(fichier)) {
        temp <- read.table(fichier, sep=",")
        return(temp)
      } else {
        return(ignore.case=F) #J'ai modifié le "return(NA)"
      }
    })
     
    res <- do.call(cbind, resultats)
    #Trouver les valeur 'FALSE' dans "res"
    R<-grep('FALSE',res)
    #Supprimer les colonnes contenant les valeurs fausses dans "res"
    resultats<-res[,-R]
    J'ai modifié le "return(NA)" et utilisé la fonction "grep" pour supprimer mes colonnes contenants les valeurs "FALSE".

    En espérant que cette solution pourra aider des gens.

    Merci encore à ceux qui m'ont aidé

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

Discussions similaires

  1. Problème liste chainée à partir d'un fichier .txt
    Par bretdu55 dans le forum Linux
    Réponses: 10
    Dernier message: 17/11/2011, 17h07
  2. [Débutant] Problème avec l'importation d'un fichier txt
    Par Figo311 dans le forum MATLAB
    Réponses: 5
    Dernier message: 11/07/2011, 18h07
  3. Problème de lecture/ecriture dans un fichier txt
    Par fraid49 dans le forum Général Python
    Réponses: 6
    Dernier message: 20/11/2008, 11h32
  4. Problème d'ouverture d'un nouveau fichier
    Par Mounamidou dans le forum Word
    Réponses: 3
    Dernier message: 04/07/2008, 11h19

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