J'ai besoin de lire un fichier csv qui a des lignes cassées pour certaines raisons. Il y a environ 60 000 lignes et certaines d'entre elles sont simplement séparées du brut précédent. Je voudrais savoir comment je peux lire le tableau et le convertir en un dataframe approprié avec
Product,Date,Quantity,Categorie,sector ABC, 01052019, 4510, Food, Dry CDE, 01052019, 222, Drink, Cold FGH, 01052019, 345, Food, Dry IJK, 01052019, 234, Food, Cold
Je saute les 6 premières lignes qui contiennent du texte aléatoire.
Product,Date,Quantity,Categorie,sector ABC, 01052019, 4510, Food, Dry CDE, 01052019, 222, Drink , Cold FGH, 01052019, 345, Food, Dry IJK, 01052019, 234, Food , Cold
J'ai remarqué que les mauvaises lignes semblent commencer par une virgule
Je voudrais pouvoir les nettoyer de cette façon:
I am reading the file this way:
All_transactions <- read.csv(paste("/Users/Match/Data/MenuReport/", 04-01-new_file.csv, sep=""), skip=6, sep=",")
4 Réponses :
Il existe probablement plusieurs façons de procéder.
MISE À JOUR: Essayez ceci alors. Avec l'argument skip = dans scan () , vous pouvez spécifier le nombre de lignes à ignorer.
file <- scan("C:/Users/skupfer/Documents/bisher.txt", strip.white = TRUE, sep = ",",
what = list("character"), skip = 1)
file_mat <- matrix(file[[1]][file[[1]] != ""], ncol = 5, byrow = TRUE)
file_df <- as.data.frame(file_mat, stringsAsFactors = FALSE)
file_df$Quantity <- as.integer(file_mat[,3])
> file_df
Product Date Quantity Categorie sector
1 ABC 01052019 4510 Food Dry
2 CDE 01052019 222 Drink Cold
3 FGH 01052019 345 Food Dry
4 IJK 01052019 234 Food Cold
Comment sautez-vous les 6 premières lignes s'il vous plaît?
Hé, l'idée m'a traversé l'esprit, et c'est ce que j'ai fini par faire selon mon commentaire ci-dessus. Maintenant, le fichier doit être produit tous les jours, je ne sais pas à quel point il est bon que des collègues ouvrent des fichiers pour supprimer des lignes quotidiennement, alors que nous pouvons le réparer avec une ligne de code et jouer en toute sécurité.
Le moyen le plus simple serait de lire le contenu du CSV sous la forme d'une chaîne de caractères unique en utilisant readr s read_file , puis de remplacer le motif newline + virgule par une virgule: < pré> XXX
J'essaie cette méthode, elle fonctionne depuis 10 minutes jusqu'à présent, ... Je suppose que je n'ai pas le choix. Le fichier a une longueur de 60k lignes mais augmentera probablement de 10-f. Question rapide, en utilisant read_csv, comment supprimer les 6 premières lignes pls?
J'ai supprimé manuellement les 6 premières lignes, mais je rencontre une erreur fatale qui déclenche un redémarrage de R.
Utilisez l'argument skip dans read_csv pour sauter des lignes. Il n'y a pas de skip dans read_file , mais il y en a dans read_lines , vous pouvez donc également l'utiliser, puis réduire le vecteur avec \ n . Gardez simplement à l'esprit que les noms de colonnes sont également ignorés. Je viens de créer 120 000 lignes à partir de données simulées en fonction des exemples de données que vous avez fournis et j'ai exécuté le code. Cela a été fait en moins d'une seconde. Il doit y avoir autre chose qui ne va pas avec les données. Pouvez-vous nous donner un échantillon plus représentatif?
Les autres solutions sont probablement meilleures, mais vous pouvez également utiliser un morceau monstrueux de code de fonction comme celui-ci (cela dépend fortement du reste de vos données suivant votre exemple de modèle de données):
library(readr)
df <- read_csv(file = "YOUR_FILE", skip = 6)
df
process_df <- function(x) {
for (row in 1:nrow(x)) {
if(sum(is.na(x[row,]) == 1)) {
if (rowSums(!is.na(x[row+1,])) == 1) {
x[row, which(is.na(x[row,]))] <- x[row+1,which(!is.na(x[3,]))]
}
}
}
x <- x[rowSums(!is.na(x[,])) > 1,]
return(x)
}
process_df(df)
p>
Comment sauter les 6 premières lignes? Ça n'a pas l'air de marcher .
J'ai changé ma réponse pour montrer comment vous pouvez supprimer les 6 premières lignes.
Une question cependant, est le texte aléatoire (qui devrait être ignoré) avant l'en-tête ou après l'en-tête? (avant ou après Produit, Date, Quantité, Catégorie, secteur ). Si les données sont avant l'en-tête, alors skip = 6 fonctionnera. Sinon, vous devriez faire quelque chose comme @bJust ci-dessous.
Solution simple utilisant la base R: Lisez en utilisant readLines, ignorez les 6 premières et continuez le processus:
dat = readLines('your_file')
dat = dat[7:length(dat)]
csv_dat = read.csv(textConnection(dat[!grepl("^,",dat)]))