Comment puis-je lire des lignes sélectionnées à partir d'un fichier volumineux à l'aide de la R “readLines de la commande” et de les écrire dans un bloc de données?

Je me suis engagé dans le nettoyage des données. J'ai une fonction qui identifie mal rangées dans un grand fichier d'entrée (trop grand pour être lu d'un seul coup, compte tenu de ma taille de la ram) et renvoie les numéros de ligne de la mauvaise lignes comme un vecteur badRows. Cette fonction semble fonctionner.

Je suis maintenant en train de lire juste les mauvaises lignes dans un bloc de données, sans succès jusqu'à présent.

Mon approche actuelle consiste à utiliser read.table sur une connexion ouverte à mon fichier, à l'aide d'un vecteur, le nombre de lignes à sauter entre chaque ligne de lecture. Ce nombre est égal à zéro pour les mauvaises consécutifs lignes.

- Je calculer skipVec:

(badRowNumbers - c(0, badRowNumbers[1:(length(badRowNumbers-1]))-1

Mais pour le moment je suis juste de remettre ma fonction d'un skipVec vecteur de tous les zéros.

Si ma logique est correcte, il doit retourner toutes les lignes. Il ne le fait pas. Au lieu de cela, j'obtiens une erreur:

"Erreur de lecture.tableau(con, skip = pass, nrow = 1, header = TRUE, sep =
"") : pas de lignes disponibles dans l'entrée"

Ma fonction actuelle est vaguement basé sur une fonction par Miron Kursa ("mbq"), que j'ai trouvé ici.

Ma question est un peu redondant, mais je suppose que sa fonctionne, donc j'ai cassé quelque sorte. Je suis encore à essayer de comprendre la différence entre l'ouverture d'un fichier et l'ouverture d'une connexion à un fichier, et je soupçonne que le problème est là, quelque part, ou dans mon utilisation de lapply.

Je suis en cours d'exécution de la R 3.0.1 sous RStudio 0.97.551 sur un grincheux vieux Windows XP SP3 machine avec 3gig de ram. L'Âge de la pierre, je sais.

Voici le code qui génère le message d'erreur ci-dessus:

# Make a small small test data frame, write it to a file, and read it back in 
# a row at a time.
testThis.DF <- data.frame(nnn=c(2,3,5), fff=c("aa", "bb", "cc"))  
testThis.DF 

# This function will work only if the number of bad rows is not too big for memory
write.table(testThis.DF, "testThis.DF")
con<-file("testThis.DF")
open(con)
skipVec <- c(0,0,0)
badRows.DF  <- lapply(skipVec, FUN=function(pass){
  read.table(con, skip=pass, nrow=1, header=TRUE, sep="") })
close(con)

L'erreur se produit avant la commande fermer. Si je copie le readLines de commande de la lapply et de la fonction et de s'en tenir simplement par lui-même, je reçois toujours le même message d'erreur.

OriginalL'auteur andrewH | 2013-10-06