2014-03-25 10 views
20

Ich habe eine große Datei (3.5G), die ich mit data.table::fread importieren möchte.Fehler 'Embedded nul in string' beim Importieren von CSV mit fread

Ursprünglich wurde es aus einer RPT-Datei erstellt, die als Text geöffnet und als CSV gespeichert wurde.

Dies funktioniert gut mit kleineren Dateien (der gleichen Art von Daten - gleiche Spalten und alle. Dies ist nur für einen längeren Zeitraum und eine größere Reichweite).

Wenn ich versuche und laufen

mydata <- fread("mycsv.csv") 

ich den Fehler:

Error in fread("mycsv.csv") : embedded nul in string: 'y\0e\0a\0r\0'

Was bedeutet das?

+3

Es sieht wie UTF-16 (2 oder mehr Bytes für jedes Zeichen, fast immer 2 Bytes) aus. Für ASCII sehen Sie den ASCII-Wert und dann ein 0-Byte. –

+1

Ich hatte das gleiche Problem beim Laden von RData-Dateien aus großen Datensätzen. Ich regeneriere die RData und das Problem verschwindet. Scheint verursacht zu werden, wenn mein RAM maximiert ist. – Cyrille

+0

Dieser Fehler tritt auch auf, wenn Sie versuchen, eine RDS-Datei unangemessen mit 'fread' zu öffnen.Frag nicht, woher ich das weiß. –

Antwort

11

Wir können den Nullabschluss auf der Kommandozeile mit so etwas wie entfernen:

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

Oder wie @marbel vorgeschlagen, fread ermöglicht es Ihnen, die sed Anruf innerhalb des Textes zu übergeben. Wie zum Beispiel:

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

Danke für die Antwort. Ich bin nicht genau sicher, wie man das in R. einträgt. Eine Sache, die ich erkannte, anscheinend, der Fehler sagt mir, dass das eingebettete nul in der Zeichenkette 'Jahr' ist, die das erste Wort der ersten Zeile des ist CSV (es ist die erste Spaltenüberschrift). Der vollständige Fehler ist [Fehler in fread ("allpcts90days1.csv"): eingebettet nul in string: 'y \ 0e \ 0a \ 0r \ 0'] Jede Idee, was das mir erzählt? Wenn ich mir den Text in einem Texteditor ansehe (TextPad oder UltraEdit, da sie mit Dateien dieser Größe umgehen können), sehe ich nichts Ungewöhnliches. – datahappy

+1

Ihre Textdatei enthält Zeichen, die in ASCII für das Beenden von Zeichenfolgen reserviert sind. Sie müssen das über die Linux-Befehlszeile ausführen oder, wenn Sie unter Windows sind, Google, um "Sonderzeichen aus Dateifenstern zu entfernen". –

+19

'fread' ermöglicht es Ihnen, den sed-Aufruf innerhalb des Textes zu übergeben. Wie zum Beispiel: 'fread (" sed 's/\\ 0 // g' mycsv.csv ")' – marbel

3

In diesem Fall können Sie read.csv mit Fileencoding von UTF-16 LE verwenden, anstatt fread.

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

Unter Berücksichtigung Ihrer Datengröße, read.csv ein paar Minuten dauern würde, aber ich denke, es ist keine große Sache ist.

+1

Mit dieser Größe von den Daten kann es tatsächlich bis zu einer Stunde dauern. –

+0

Basierend auf meiner Erfahrung, kann das Laden von 3,5GB Daten kaum mehr als 15 Minuten dauern, außer in einigen sehr extremen Fällen. – Fan

3

Sie können diese kleine Funktion testen:

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

Es ist für mich Arbeit

1

Eine nicht-technische Möglichkeit, dies sein, die problematische zu

  1. öffnen würde zu lösen. csv

  2. Strg + A (Alle auswählen)

  3. öffnen neue Excel-Blatt

  4. Rechts klicken und wählen Sie ‚Einfügen als Werte‘

  5. speichern und verwenden diese Datei anstelle der Original.

Arbeitete für mich und braucht nicht viel Zeit.

Verwandte Themen