web-dev-qa-db-fra.com

Traitement de la fonction readLines () dans R

Je vis un temps très difficile avec R ces derniers temps.

Je ne suis pas un utilisateur expert, mais j'essaie d'utiliser R pour lire un fichier texte brut (.txt) et en capturer chaque ligne. Après cela, je veux traiter de ces lignes et faire des pauses et des modifications dans le texte.

Voici le code que j'utilise:

fileName <- "C:/MyFolder/TEXT_TO_BE_PROCESSED.txt"
con <- file(fileName,open="r")
line <- readLines(con)
close(con)

Il lit le texte et la ligne se casse parfaitement. Mais je ne comprends pas comment fonctionne l’objet créé line.

L'objet line créé avec ce code a la classe: character et la longueur [57]. Si je tape line[1], il affiche exactement le texte de la première ligne. Mais si je tape 

length(line[1])

il me renvoie [1].

Je voudrais savoir comment puis-je transformer cette chaîne de length == 1 qui contient 518 en fait en une chaîne de length == 518.

Est-ce que quelqu'un sait ce que je fais mal?

Je n'ai pas nécessairement besoin d'utiliser la fonction readLines(). J'ai fait des recherches et trouvé également la fonction scan(), mais je me suis retrouvé dans le même cas où une chaîne immuable de 518 caractères mais length == 1.

J'espère que j'ai été assez clair sur mon doute. Désolé pour le mauvais anglais.

8
user3521631

Supposons que txt soit le texte de la ligne 1 de vos données que vous avez lu avec readLines.
Ensuite, si vous souhaitez le scinder en chaînes séparées, chacune étant un mot, vous pouvez utiliser strsplit, en scindant l'espace entre chaque mot.

> txt <- paste0(letters[1:10], LETTERS[1:10], collapse = " ")
> txt
## [1] "aA bB cC dD eE fF gG hH iI jJ"   ## character vector of length 1
> length(txt)
[1] 1
> newTxt <- unlist(strsplit(txt, split = "\\s"))  ## split the string at the spaces
> newTxt
## [1] "aA" "bB" "cC" "dD" "eE" "fF" "gG" "hH" "iI" "jJ"
## now the text is a character vector of length 10  
> length(newTxt)
[1] 10
5
Rich Scriven

Vous pouvez d’abord condenser ce code sur une seule ligne, les 3 autres lignes ne faisant que créer des objets inutiles.

line <- readLines("C:/MyFolder/TEXT_TO_BE_PROCESSED.txt")

Le si vous voulez savoir combien de mots sont séparés par une espace

words <- sapply(line,function(x) length(unlist(strsplit(x,split=" "))))

Si vous omettez l'argument length dans ce qui précède, vous obtenez une liste de vecteurs de caractères des mots de chaque ligne.

5
JeremyS

Que diriez-vous:

con <- file(fileName, open='r')
text <- readLines(con)[[1]]

pour obtenir le texte de la première ligne du fichier.

1
Thys Potgieter