it-swarm.com.de

RStudio wählt nicht die Kodierung aus, die ich beim Lesen einer Datei verwenden soll

Ich versuche, die folgende UTF-8-codierte Datei in R zu lesen, aber wenn ich sie lese, werden die Unicode-Zeichen nicht korrekt codiert:

enter image description here

Das Skript, das ich zur Verarbeitung der Datei verwende, lautet wie folgt:

defaultEncoding <- "UTF8"
detalheVotacaoMunicipioZonaTypes <- c("character", "character", "factor", "factor", "factor", "factor", "factor",
                                                     "factor", "factor", "factor", "factor", "factor", "numeric", 
                                                     "numeric", "numeric", "numeric", "numeric", "numeric",
                                                     "numeric", "numeric", "numeric", "numeric", "numeric", 
                                                     "numeric", "character", "character")

readDetalheVotacaoMunicipioZona <- function( fileName ) {
  fileConnection = file(fileName,encoding=defaultEncoding)
  contents <- readChar(fileConnection, file.info(fileName)$size)  
  close(fileConnection)
  contents <- gsub('"', "", contents)

  columnNames <- c("data_geracao", "hora_geracao", "ano_eleicao", "num_turno", "descricao_eleicao", "sigla_uf", "sigla_ue",
                   "codigo_municipio", "nome_municipio", "numero_zona", "codigo_cargo", "descricao_cargo", "qtd_aptos", 
                   "qtd_secoes", "qtd_secoes_agregadas", "qtd_aptos_tot", "qtd_secoes_tot", "qtd_comparecimento",
                   "qtd_abstencoes", "qtd_votos_nominais", "qtd_votos_brancos", "qtd_votos_nulos", "qtd_votos_legenda", 
                   "qtd_votos_anulados", "data_ult_totalizacao", "hora_ult_totalizacao")

  read.csv(text=contents, 
           colClasses=detalheVotacaoMunicipioZonaTypes,
           sep=";", 
           col.names=columnNames, 
           fileEncoding=defaultEncoding,
           header=FALSE)
}

Ich las die Datei, die in der UTF-8-Codierung gesendet wurde, entferne alle Anführungszeichen (gerade Zahlen werden in Anführungszeichen gesetzt, daher muss ich sie bereinigen) und dann den Inhalt an read.csv übergeben. Es liest und verarbeitet die Datei korrekt, scheint jedoch nicht die Codierungsinformationen zu verwenden, die ich ihnen gebe.

Was muss ich tun, damit UTF-8 zum Lesen dieser Datei verwendet wird?

Ich verwende RStudio unter OSX, wenn es einen Unterschied macht.

17

Dieses Problem wird durch das falsche Gebietsschema verursacht, das sich in RStudio oder in der Befehlszeile R befindet:

  1. Wenn das Problem nur in RStudio auftritt nicht in der Befehlszeile R, gehen Sie zu RStudio-> Einstellungen: Allgemein, geben Sie an, was für 'Standardtextcodierung:' eingestellt ist, klicken Sie auf 'Ändern' und versuchen Sie Windows-1252, UTF -8 oder ISO8859-1 ('latin1') (oder 'Ask', wenn Sie immer gefragt werden möchten). Screenshot unten angefügt. Lass uns wissen, welche funktionierte! 

  2. Wenn das Problem auch in der Befehlszeile R auftritt, gehen Sie wie folgt vor:

Geben Sie an Ihrem Mac locale -m und sagen Sie uns, ob er CP1252 oder ISO8859-1 ('latin1') unterstützt? Erstellen Sie bei Bedarf die Liste der unterstützten Ländereinstellungen. (Sie können uns genauso gut Ihre Version von MacOS mitteilen, wenn Sie gerade dabei sind.)

Versuchen Sie, für diese beiden Ländereinstellungen diese Ländereinstellung zu ändern:

# first try Windows CP1252, although that's almost surely not supported on Mac:
Sys.setlocale("LC_ALL", "pt_PT.1252") # Make sure not to omit the `"LC_ALL",` first argument, it will fail.
Sys.setlocale("LC_ALL", "pt_PT.CP1252") # the name might need to be 'CP1252'

# next try IS08859-1(/'latin1'), this works for me:
Sys.setlocale("LC_ALL", "pt_PT.ISO8859-1")

# Try "pt_PT.UTF-8" too...

# in your program, make sure the Sys.setlocale worked, sprinkle this assertion in your code before attempting to read.csv:
stopifnot(Sys.getlocale('LC_CTYPE') == "pt_PT.ISO8859-1")

Das sollte funktionieren . Streng genommen sollte der Sys.setlocale()-Befehl in Ihrem ~/.Rprofile zum Start gehen, nicht in Ihrer R-Sitzung oder im Quellcode . Allerdings kann Sys.setlocale() fehlschlagen, also sollten Sie sich dessen bewusst sein. Bestätigen Sie auch Sys.getlocale() in Ihrem Setup-Code früh und häufig, so wie ich es tue. (read.csv sollte wirklich herausfinden, ob die verwendete Codierung mit dem Gebietsschema kompatibel ist, und eine Warnung oder ein Fehler, falls nicht).

Lass uns wissen, welcher Fix funktioniert hat! Ich versuche, dies allgemeiner zu dokumentieren, damit wir die richtige Verbesserung herausfinden können.

  1. Screenshot der RStudio-Einstellungen Ändern Sie das Standardmenü für die Textcodierung: enter image description here
14
smci

Es funktioniert gut für mich.

Haben Sie versucht, das Gebietsschema zu ändern/zurückzusetzen?

in meinem fall funktioniert es mit 

Sys.setlocale(category = "LC_ALL", locale = "Portuguese_Portugal.1252")

d <- read.table(text=readClipboard(), header=TRUE, sep = ';')

head(d)

1  25/04/2014  22:29:30  2012  1 ELEIÇÃO MUNICIPAL 2012 PB  20419    20419      ITAPORANGA  33  13 VEREADOR 17157
2  25/04/2014  22:29:30  2012  1 ELEIÇÃO MUNICIPAL 2012 PB  20770    20770           MALTA  51  11 PREFEITO  4677
3  25/04/2014  22:29:30  2012  1 ELEIÇÃO MUNICIPAL 2012 PB  21091    21091     OLHO D'ÁGUA  32  13 VEREADOR  6653
4  25/04/2014  22:29:30  2012  1 ELEIÇÃO MUNICIPAL 2012 PB  21113    21113        OLIVEDOS  23  13 VEREADOR  3243
...
3

Ich hatte das gleiche Problem mit dem portugiesischen Gebietsschema in r (MAC OS 10.12.3) Ich habe es wie oben pro Thread versucht und niemand hat gearbeitet. Dann fand ich diese Webseite: https://docs.moodle.org/dev/Table_of_locales Und habe gerade Sys.setlocale(category = "LC_ALL", locale = "pt_PT.UTF-8") ausprobiert und es funktioniert. 

2
Jesús Bescos

Sie sollten library(readr)-Funktionen ausprobieren, wie read_csv() oder read_fwf() (beachten Sie den Unterstrich anstelle des Punktes). Die Codierung der Datei wird vermutet. Dies gelingt normalerweise; Diese Readr-Funktionen sind in der RStudio-GUI-Funktion "Datenmenge importieren" enthalten.

0
Elio Diaz