web-dev-qa-db-fra.com

Erreur 'nul intégré dans la chaîne' lors de l'importation de csv avec fread

J'ai un gros fichier (3,5 G) que j'essaie d'importer à l'aide de data.table::fread.

Il a été créé à l'origine à partir d'un fichier rpt qui a été ouvert en tant que texte et enregistré en tant que CSV.

Cela a bien fonctionné avec des fichiers plus petits (du même type de données - mêmes colonnes et tout. Celui-ci est juste pour une période plus longue et une portée plus large).

Quand j'essaie de courir

mydata <- fread("mycsv.csv")

Je reçois l'erreur:

Erreur en fread ("mycsv.csv"): nul intégré dans la chaîne: 'y\0e\0a\0r\0'

Qu'est-ce que ça veut dire?

27
datahappy

Nous pouvons supprimer les terminateurs nuls sur la ligne de commande en utilisant quelque chose comme:

sed 's/\\0//g' mycsv.csv > mycsv.csv

Ou comme suggéré par @marbel, fread vous permet de passer l'appel sed à l'intérieur du texte. Tel que:

fread("sed 's/\\0//g' mycsv.csv")
14

Vous pouvez tester cette petite fonction:

cleanFiles<-function(file,newfile){
  writeLines(iconv(readLines(file,skipNul = TRUE)),newfile)
}

C'est du travail pour moi

4
xrsousa

Dans ce cas, vous pouvez utiliser read.csv avec fileEncoding de UTF-16LE plutôt que fread.

read.csv("mycsv.csv",fileEncoding="UTF-16LE")

Compte tenu de la taille de vos données, utilisez read.csv prendrait quelques minutes, mais je pense que ce n'est pas grave.

4
Fan Wang

Un moyen non technique de résoudre ce problème serait de

  1. Ouvrez la problématique . Csv

  2. Ctrl + A (Tout sélectionner)

  3. Ouvrir une nouvelle feuille Excel

  4. Faites un clic droit et choisissez "Coller comme valeurs"

  5. Enregistrez et utilisez ce fichier à la place de l'original.

A fonctionné pour moi et ne prend pas beaucoup de temps.

2
Pree

Si vous voyez des caractères NUL (x00) dans un fichier ASCII vous pouvez le faire: data.table :: fread (text = readLines (pathIn, skipNul = T), ...)

1
Jim Cutler