web-dev-qa-db-fra.com

Chaîne multi-octets non valide dans read.csv

J'essaie d'importer un csv qui est en japonais. Ce code:

url <- 'http://www.mof.go.jp/international_policy/reference/itn_transactions_in_securities/week.csv'
x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE)

renvoie l'erreur suivante:

Error in type.convert(data[[i]], as.is = as.is[i], dec = dec, na.strings = character(0L)) : 
invalid multibyte string at '<91>ΊO<8b>y<82>ёΓ<e0><8f>،<94><94><84><94><83><8c>_<96>????̏????@(<8f>T<8e><9f><81>E<8e>w<92><e8><95>????@<8a>փx<81>[<83>X<81>j'

J'ai essayé de changer l'encodage (Encoding(url) <- 'UTF-8' et aussi en latin1) et j'ai essayé de supprimer les paramètres read.csv, mais j'ai reçu le même message "chaîne multioctet invalide" dans chaque cas. Existe-t-il un codage différent à utiliser ou existe-t-il un autre problème?

40
jaredwoodard

Encoding définit le codage d'une chaîne de caractères. Il ne définit pas l'encodage du fichier représenté par la chaîne de caractères, ce que vous voulez.

Cela a fonctionné pour moi, après avoir essayé "UTF-8":

x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE, fileEncoding="latin1")

Et vous pouvez sauter les 16 premières lignes et lire séparément les en-têtes. Quoi qu'il en soit, il reste encore beaucoup de nettoyage à faire.

x <- read.csv(url, header=FALSE, stringsAsFactors=FALSE,
  fileEncoding="latin1", skip=16)
# get started with the clean-up
x[,1] <- gsub("\u0081|`", "", x[,1])    # get rid of odd characters
x[,-1] <- as.data.frame(lapply(x[,-1],  # convert to numbers
  function(d) type.convert(gsub(d, pattern=",", replace=""))))
73
Joshua Ulrich

Vous avez peut-être rencontré ce problème en raison de l'incompatibilité des paramètres régionaux du système, essayez de définir les paramètres régionaux du système avec ce code Sys.setlocale("LC_ALL", "C")

10
user3670684

Le paquet readr de l'univers tidyverse pourrait aider.

Vous pouvez définir l'encodage via l'argument local de la fonction read_csv() en utilisant la fonction local() et son argument d'encodage:

read_csv(file = "http://www.mof.go.jp/international_policy/reference/itn_transactions_in_securities/week.csv",
         skip = 14,
         local = locale(encoding = "latin1"))
7
Je Hsers

La solution la plus simple que j'ai trouvée pour ce problème sans perdre aucune donnée/caractère spécial (par exemple lors de l'utilisation de fileEncoding="latin1" les caractères comme le signe Euro € seront perdus) consiste à ouvrir le fichier d'abord dans un éditeur de texte comme Sublime Text, puis à "Enregistrer avec encodage - UTF-8".

Ensuite, R peut importer le fichier sans problème et sans perte de caractère.

1
Guiwald Doh

J'ai eu la même erreur et j'ai essayé tout ce qui précède en vain. Le problème a disparu lors de la mise à niveau de R 3.4.0 vers 3.4.3, donc si votre version R n'est pas à jour, mettez-la à jour!

0
user5783745

Pour ceux qui utilisent Rattle avec ce problème, voici comment je l'ai résolu:

  1. Assurez-vous d'abord de quitter le hochet pour que votre invite de commande R
  2. > library (rattle) (si ce n'est déjà fait)
  3. > crv$csv.encoding="latin1"
  4. > rattle()
  5. Vous devriez maintenant pouvoir continuer. c'est-à-dire importez votre csv> Exécuter> Modèle> Exécuter etc.

Cela a fonctionné pour moi, j'espère que cela aide un voyageur fatigué

0
wired00

Si le fichier que vous essayez d'importer dans R était à l'origine un fichier Excel. Assurez-vous d'ouvrir le fichier d'origine et d'enregistrer en tant que csv et cela a corrigé cette erreur pour moi lors de l'importation dans R.

0
822_BA

J'ai eu un problème similaire avec des articles scientifiques et j'ai trouvé une bonne solution ici: http://tm.r-forge.r-project.org/faq.html

En utilisant la ligne de code suivante:

tm_map(yourCorpus, content_transformer(function(x) iconv(enc2utf8(x), sub = "byte")))

vous convertissez les chaînes multi-octets en code hexadécimal. J'espère que ça aide.

0
Carlos