0
votes

Comment supprimer des éléments avant ou après l'espace dans un vecteur R

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

r

4 commentaires

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


3 Réponses :


1
votes

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"
)

data

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"


0 commentaires

1
votes

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"


0 commentaires

1
votes

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(.)]


0 commentaires