Le logiciel que j'utilise génère des fichiers journaux avec un nombre variable de lignes d'informations récapitulatives suivies de nombreuses données délimitées par des tabulations. J'essaye d'écrire une fonction qui lira les données de ces dossiers de notation dans une trame de données en ignorant les informations de résumé. Les informations de résumé ne contient jamais un onglet, donc la fonction suivante fonctionne:Comment ignorer des lignes supplémentaires avant l'en-tête d'un fichier délimité délimité par des tabulations dans R
read.parameters <- function(file.name, ...){
lines <- scan(file.name, what="character", sep="\n")
first.line <- min(grep("\\t", lines))
return(read.delim(file.name, skip=first.line-1, ...))
}
Cependant, ces fichiers journaux sont assez grandes, et la lecture si le fichier est deux fois très lent. Sûrement il y a un meilleur moyen?
Edité à ajouter:
Marek a suggéré d'utiliser un objet textConnection
. La façon dont il a suggéré dans la réponse échoue sur un gros fichier, mais les travaux suivants:
read.parameters <- function(file.name, ...){
conn = file(file.name, "r")
on.exit(close(conn))
repeat{
line = readLines(conn, 1)
if (length(grep("\\t", line))) {
pushBack(line, conn)
break}}
df <- read.delim(conn, ...)
return(df)}
Edité à nouveau: Merci Marek pour améliorer encore la fonction ci-dessus.
Pour fermer la connexion en toute sécurité, vous pouvez utiliser la fonction 'on.exit'. Juste après 'conn = file (...)' ajouter une ligne 'on.exit (close (conn))'. Ensuite, lorsqu'une fonction termine une tâche (normalement ou avec une erreur), la connexion sera fermée. Sinon, lorsque vous avez une erreur quelque part entre 'file' et' close', la connexion sera ouverte. – Marek
Merci, bonne technique. Je l'ai mis à jour. –