2
votes

Lecture de lignes CSV interrompues à partir de R

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


0 commentaires

4 Réponses :


2
votes

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



2 commentaires

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é.



3
votes

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


3 commentaires

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?



1
votes

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>


3 commentaires

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.



1
votes

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


0 commentaires