Définissez d'abord les données de test de manière reproductible - nous avons utilisé deux instances des données présentées dans la question. Nous notons que la partie délicate est que chaque enregistrement dépasse plus d'une ligne dans la question.
Lire dans Lines
- avec les données réelles remplacer textConnection(Lines)
, qui est de garder le code autonome, avec "myfile.txt"
, par exemple.
Ensuite, le premier sub
insère un espace au début de chaque ligne et la seconde remplace tout jusqu'au LONGUEUR: sur une ligne contenant LONGUEUR: avec saut de ligne, DATE:
, la date et LENGTH:
. Le gsub
insère un retour à la ligne avant chaque mot clé, et le paste
le regroupe en une seule grande chaîne séparée par une nouvelle ligne. strsplit
le sépare de nouveau afin que les nouvelles lignes que nous avons ajoutées sont effectuées.
Les données sont maintenant au format DCF, donc nous pouvons le lire en utilisant read.dcf
. Le format DCF sépare les enregistrements par une ou plusieurs lignes vides et démarre chaque champ avec le nom de champ suivi d'un signe deux-points et d'un espace suivi de la valeur. La valeur peut s'exécuter sur plusieurs lignes à condition que les lignes suivantes soient indentées, par ex. Commencez avec un espace.
Ceci donne une matrice avec les 5 colonnes indiquées. La dernière sub
supprime les virgules à la fin de chaque élément et la dernière gsub
remplace les nouvelles lignes par des espaces.
Notez que nous avons placé les champs dans des colonnes, ce qui correspond normalement à la façon dont les données sont représentées dans R, mais si vous le souhaitez vraiment dans les lignes, utilisez t(dcf)
.
# test data
Lines <- "December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~
December 4, 2016 Sunday, LENGTH: 1070 words, HEADLINE: Korea presents new farm
development model globally, BYLINE: By Yoon Ja-young, BODY: ~~~"
# code
L0 <- readLines(textConnection(Lines))
L <- sub("^", " ", L0)
L <- sub("(.*) LENGTH:", "\nDATE: \\1 LENGTH:", L)
L <- gsub("(\\w+:)", "\n\\1", L)
L <- paste(L, collapse = "\n")
L <- unlist(strsplit(L, "\n"))
dcf <- read.dcf(textConnection(L))
dcf[] <- sub(",$", "", dcf)
dcf[] <- gsub("\n", " ", dcf)
Cela donne la matrice de caractères 5 colonne suivante:
> dcf
DATE LENGTH
[1,] "December 4, 2016 Sunday" "1070 words"
[2,] "December 4, 2016 Sunday" "1070 words"
HEADLINE BYLINE
[1,] "Korea presents new farm development model globally" "By Yoon Ja-young"
[2,] "Korea presents new farm development model globally" "By Yoon Ja-young"
BODY
[1,] "~~~"
[2,] "~~~"
Mise à jour: Date ajoutée à la production.
Certainement regex, voir? regexpr ou [regexpr] (https://stat.ethz.ch/R-manual/R-devel/library/base/html/regex.html) –
Merci pour votre commentaire! –