Ich habe eine CSV-Datei, die sich im Binärzeichensatz befindet, muss aber in UTF konvertieren. 8 zum Verarbeiten in HDFS (Hadoop).
Ich habe den folgenden Befehl verwendet, um den Zeichensatz zu überprüfen.
file -bi filename.csv
Ausgabe:
application/octet-stream; charset=binary
Wenn ich versuche, die Datei von binär nach UTF-8 zu konvertieren, wird ein Fehler ausgegeben.
iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information.
kann mir bitte jemand helfen zu verstehen, ob es möglich ist zu konvertieren oder nicht, ich kann die Daten mit dem Befehl head sehen.
Was bedeutet es, binär bedeutet nicht lesbar, aber wie head-Befehl oder Notizblock kann die Daten lesen.
od -tc < Dateiname.csv | head
0000000 357 273 277 | | R e q u e s t _ I D # 0000020 D # T y p e # D # S u b m i t t 0000040 e r # D # S h o r t _ D e s c r 0000060 i p t i o n # D # L o g _ T e x 0000100 t # D # S t a t u s # D # A s s 0000120 i g n e d _ T o # D # A s s i g 0000140 n e e # D # C r e a t e _ D a t 0000160 e # D # F o r w T o E x t H D # 0000200 D # L a s t _ M o d i f i e d _ 0000220 B y # D # L o g _ I D # D # L o
Kommentare
- Können Sie Bitte fügen Sie die Ausgabe von
od -tc < yourfile.csv | head
zu Ihrer Frage hinzu. - Datei -bi zeigt ihr Binärzeichen. Wenn ich von Vi aus überprüfe, zeigt die Zeichencodierung utf-8 an.
- Diese
od
Ausgabe zeigt eine UTF-8-Datei mit Stückliste. Damitfile
Binärdaten meldet, müssen nach diesem ersten Abschnitt einige Nicht-Textzeichen (wahrscheinlich mindestens ein NUL-Byte, gefolgt von einigen Nicht-NUL-Bytes) vorhanden sein. - Ich habe alle " NUL " entfernt, nachdem diese Datei -bi als utf-8 angezeigt wird. Ich hoffe, NUL " ist kein Problem.
Antwort
“ binär „ist keine Kodierung (Zeichensatzname ). iconv benötigt einen Codierungsnamen, um seine Arbeit zu erledigen.
Das Dienstprogramm file
gibt keine nützlichen Informationen, wenn es das Dateiformat nicht erkennt könnte beispielsweise UTF-16
ohne eine Byte-Codierungsmarke (BOM) sein. notepad
liest dies. Gleiches gilt für UTF-8
(und head
würde das anzeigen, da Ihr Terminal möglicherweise auf t eingestellt ist o UTF-8-Codierung, und es würde sich nicht um eine Stückliste kümmern.
Wenn die Datei UTF-16 ist, würde Ihr Terminal dies mit head
anzeigen, weil Die meisten Zeichen wären ASCII (oder sogar Latin-1), wodurch das „andere“ Byte der UTF-16-Zeichen eine Null wird.
In beiden Fällen wird das Fehlen einer Stückliste (abhängig von der Version von file
) verwirren es. Andere Programme funktionieren jedoch möglicherweise, da diese Dateiformate sowohl mit Microsoft Windows als auch mit portablen Anwendungen verwendet werden können, die unter Windows ausgeführt werden können.
Um die Datei in UTF-8 zu konvertieren, müssen Sie wissen, welche Codierung sie enthält verwendet, und wie lautet der Name für diese Codierung mit iconv
. Wenn es bereits UTF-8 ist, ist es optional, ob Sie (am Anfang) eine Stückliste hinzufügen. UTF-16 hat zwei Varianten, nach denen das Byte das erste ist. Oder Sie könnten sogar UTF-32 haben. iconv -l
listet diese auf:
ISO-10646/UTF-8/ ISO-10646/UTF8/ UTF-7// UTF-8// UTF-16// UTF-16BE// UTF-16LE// UTF-32// UTF-32BE// UTF-32LE// UTF7// UTF8// UTF16// UTF16BE// UTF16LE// UTF32// UTF32BE// UTF32LE//
„LE“ und „BE“ beziehen sich auf Little-End und Big-End für die Bytereihenfolge. Windows verwendet die Geschmacksrichtungen „LE“, und iconv
geht wahrscheinlich davon aus, dass für die Geschmacksrichtungen „LE“ oder „BE“ fehlt.
Sie können dies mit einem Oktal sehen (sic) dump:
$ od -bc big-end 0000000 000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 \0 T \0 h \0 u \0 \0 A \0 u \0 g \0 0000020 000 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 \0 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 0000040 000 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 \0 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 0000060 000 062 000 060 000 061 000 066 000 012 \0 2 \0 0 \0 1 \0 6 \0 \n 0000072 $ od -bc little-end 0000000 124 000 150 000 165 000 040 000 101 000 165 000 147 000 040 000 T \0 h \0 u \0 \0 A \0 u \0 g \0 \0 0000020 061 000 070 000 040 000 060 000 065 000 072 000 060 000 061 000 1 \0 8 \0 \0 0 \0 5 \0 : \0 0 \0 1 \0 0000040 072 000 065 000 067 000 040 000 105 000 104 000 124 000 040 000 : \0 5 \0 7 \0 \0 E \0 D \0 T \0 \0 0000060 062 000 060 000 061 000 066 000 012 000 2 \0 0 \0 1 \0 6 \0 \n \0 0000072
Unter der Annahme von UTF-16LE könnten Sie mit
iconv -f UTF-16LE// -t UTF-8// <input >output
^@
angezeigt werden) und prüfen Sie, ob die Daten in der Umgebung gültig sind.
Antwort
strings
(von binutils) ist erfolgreich mit “ Drucken Sie die Zeichenfolgen druckbarer Zeichen in Dateien „, wenn sowohl iconv
als auch recode
ebenfalls fehlgeschlagen sind, wobei file
meldet den Inhalt weiterhin als Binärdaten:
$ file -i /tmp/textFile /tmp/textFile: application/octet-stream; charset=binary $ chardetect /tmp/textFile /tmp/textFile: utf-8 with confidence 0.99 $ iconv -f utf-8 -t utf-8 /tmp/textFile -o /tmp/textFile.iconv $ file -i /tmp/textFile.iconv /tmp/textFile.iconv: application/octet-stream; charset=binary $ cp /tmp/textFile /tmp/textFile.recode ; recode utf-8 /tmp/textFile.recode $ file -i /tmp/textFile.recode /tmp/textFile.recode: application/octet-stream; charset=binary $ strings /tmp/textFile > /tmp/textFile.strings $ file -i /tmp/textFile.strings /tmp/textFile.strings: text/plain; charset=us-ascii
Kommentare
-
strings
behält keine Leerzeilen bei. Davon abgesehen erledigt es die Aufgabe. - @vulcanraven Die Option
-w
(--include-all-whitespace
) enthält Zeilenumbrüche und Wagen gibt zurück,
Antwort
https://pypi.python.org/pypi/chardet kann verwendet werden, um die Codierung Ihres Textes zu bestimmen. Anschließend können Sie diese in das konvertieren, was Sie benötigen.
pip install chardet chardetect /my/path/to/file
Während file -i
druckt
application/octet-stream; charset=binary
chardet
erkennt
ascii with confidence 1.0
korrekt