2017-10-11 2 views
1

Pendant que je nettoie des données contenant des caractères codés en UTF-8, je rencontre le problème dans le titre. Avant de décrire le problème plus en détail, permettez-moi d'abord de prendre le temps d'expliquer les exemples de données qui peuvent être téléchargés à partir de here. L'exemple de données est un .csv de dimension 1 par 11. Une vérification rapide qui évite d'utiliser read.table ou read.csv le révèle.R: read.csv/read.table ne reconnaît pas toutes les colonnes en raison de caractères codés UTF-8

> con <- file(description = file.path(somedir, 'test.csv'), open = 'rb', encoding = 'UTF-8') 
> rawContent <- readLines(con = con, encoding = 'UTF-8') 
> close(con) 

# check dimension 
> colcounts <- sapply(rawContent, function(x){length(gregexpr(pattern = ',', text = x)[[1]])}) 
> names(colcounts) <- seq_along(rawContent) 
> colcounts 
1 
10 

Les données sont également affichés ici pour un accès facile et sûr:

> dput(rawContent) 
"100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1," 

Maintenant, la question est que la présence de ces caractères UTF-8 codé fait en quelque sorte des lecteurs tels que read.table et read.csv dysfonctionnement . Pour être plus précis, il ne reconnaît pas toutes les colonnes.

> df1 = read.table(text = rawContent, header = F, sep = ',', quote = '', comment.char = '', encoding = 'UTF-8') 
> dim(df1) 
[1] 1 9 
> print(df1) 
    V1 V2  V3 V4  V5        V6      V7 V8 V9 
1 100003516 B 110102 921 100044 图书、报纸制版印刷,印刷设备生产 印刷器材文化用品销售,2311 1 NA 

Comme vous pouvez le voir, les virgules , en V6, V7 sont considérées comme du contenu même si je désactivé quote. L'utilisation de read.csv donnerait un résultat similaire, tout comme read.delim. Tous les commentaires, suggestions ou solutions sont les bienvenus! Merci!

Annexe 171013

Voici quelques informations supplémentaires en ce qui concerne le réglage du système pour vos intérêts:

> Sys.getlocale() 
[1] "LC_COLLATE=Chinese (Simplified)_China.936;LC_CTYPE=Chinese (Simplified)_China.936;LC_MONETARY=Chinese (Simplified)_China.936;LC_NUMERIC=C;LC_TIME=Chinese (Simplified)_China.936" 

> l10n_info() 
$MBCS 
[1] TRUE 

$`UTF-8` 
[1] FALSE 

$`Latin-1` 
[1] FALSE 

$codepage 
[1] 936 

> Encoding(rawContent) 
[1] "UTF-8" 

Annexe 20171015

Outre les excellentes réponses ci-dessous, je l'ai aussi perplexes sur une solution par chance. Je ne comprends pas très bien comment cela fonctionne, mais en cohérence avec ce que @Karsten W a mentionné, c'est probablement en contournant le baratin que le programme R peut avoir avec la configuration des paramètres régionaux du système en stockant les données en externe. Voici les codes:

rawCotent <- "100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1," 

con <- file(description = 'text.csv', open = 'wb', encoding = 'UTF-8') 
writeLines(text = rawContent, con = con, useBytes = T) 
close(con) 

df <- read.csv(file = 'text.csv', header = F, encoding = 'UTF-8') 
print(df) 
     V1 V2  V3 V4  V5     V6   V7     V8 V9 V10 V11 
1 100003516 B 110102 921 100044 图书、报纸制版印刷 印刷设备生产 印刷器材文化用品销售 2311 1 NA 
+0

Vous avez mis un peu d'effort dans la question. Je vous remercie. Beaucoup de gens ne veulent pas télécharger des fichiers de sources inconnues pour voir les données. Pour rendre vos données disponibles pour cette question, utilisez 'dput ()'. Si c'est beaucoup de données, vous pouvez prendre une plus petite partie en utilisant 'dput (head ())'. – shea

+0

@shea merci pour la suggestion! J'ai posté les données comme vous l'avez recommandé – Xiangyu

+0

Je ne peux pas reproduire ce comportement. En utilisant 'read.csv (text = rawContent, header = FALSE)' j'obtiens un 'data.frame' avec 11 colonnes. –

Répondre

1

De ?Sys.getlocale:

"Les tentatives de changer le jeu de caractères (par Sys.setlocale (" LC_CTYPE »,), si cela implique un jeu de caractères différents) lors d'une session peut pas travailler et sont susceptibles de conduire à une certaine confusion. "

Je pense que c'est la raison pour laquelle votre code ne fonctionne pas. Une solution rapide serait

cset <- Sys.getlocale("LC_CTYPE") 
Sys.setlocale("LC_CTYPE", "C") 
rawContent <- "100003516,B,110102,00921,100044,图书、报纸制版印刷,印刷设备生产,印刷器材文化用品销售,2311,1," 
dat <- read.csv(text=rawContent, header=FALSE) 
Sys.setlocale("LC_CTYPE", cset) 
ncol(dat) 
[1] 11