J'ai environ 200 fichiers .txt de paroles de chansons qui ont un format similaire à celui-ci
lines <- readLines(txtfile) lines > "Useless info" "useless info" "" "" "First Verse" "First Verse" > "" "" "Second Verse" "Second Verse" "" "" "useless info"
et j'aimerais tous les lire dans R pour faire du text mining. Ma pensée est de les lire avec readLines puis de supprimer des éléments de ce vecteur avant les première et dernière lignes vides. C'est ce que j'ai jusqu'à présent.
Useless info useless info First Verse First Verse Second Verse Second Verse useless info
Si je devais coder en dur la solution, j'aurais juste des éléments lignes [5: 6,8: 9] et l'assigner à une nouvelle variable, mais comme les paroles des chansons ont parfois deux couplets et parfois trois, j'espérais qu'il y aurait une solution qui supprimerait les éléments avant le premier double "" et après le dernier double " "
Si je me trompe et que quelqu'un a une meilleure idée, je suis plus qu'heureux de l'entendre aussi!
MISE À JOUR: Les lignes" Informations inutiles "don ' t dire littéralement "Informations inutiles", ce sont les chemins de fichiers vers les paroles et les balises, donc pour des raisons analytiques, ils me sont inutiles
3 Réponses :
Nous pouvons créer une variable de regroupement avec rleid
lines <- c("Useless info", "useless info", "", "", "First Verse", "First Verse",
"", "", "Second Verse", "Second Verse", "", "", "useless info"
)
library(data.table) lst1 <- split(lines, rleid(nzchar(lines))) lst2 <- lst1[-c(1, length(lst1))] out <- unlist(lst2[sapply(lst2, function(x) all(nzchar(x)))], use.names = FALSE) out #[1] "First Verse" "First Verse" "Second Verse" "Second Verse"
Dans la base R:
First Verse First Verse Second Verse Second Verse
Ce qui, lorsqu'il est imprimé ou écrit dans un fichier texte, donne
sapply(strsplit(paste(lines, collapse = "&esc;"), "(&esc;){2,3}"),
function(x) paste0(gsub("&esc;", "\n", x[-c(1, length(x))]), collapse = "\n\n"))
# [1] "First Verse\nFirst Verse\n\nSecond Verse\nSecond Verse"
La meilleure solution peut dépendre de l'apparence de votre traitement ultérieur, par exemple si vous souhaitez conserver les informations sur les versets (le rleid de @ akrun serait utile ici), tout réduire en une seule chaîne, etc.
En fonction de la mise en page du fichier, vous pouvez supprimer les premiers éléments non vides, et le dernier élément, puis tous les éléments vides entre les deux:
# optional: read file _textfile_ with `data.table::fread` lines <- data.table::fread(text="textfile", header=FALSE, sep=NULL, colClasses='character')$V1 first.empty <- which(!nzchar(lines))[1] # determine where to start lines <- lines[first.empty:(length(lines)-1)] # also remove last element lines <- lines[nzchar(lines)] # remove empty elements lines # or with `magrittr` pipe: lines[first.empty:(length(lines)-1)] %>% .[nzchar(.)]
essayez
lignes [nzchar (lignes)]Est-ce une chaîne fixe ou est différente dans chaque cas
C'est différent dans chaque cas. Parfois, il y a deux lignes d'informations inutiles, et parfois il y en a trois au début du document, mais toujours une à la fin
Pouvez-vous vérifier si la solution que j'ai publiée fonctionne pour vous