Konvertieren Sie die Binärcodierung, die Kopf und Editor in UTF-8 lesen können.

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. Damit file 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 

Kommentare

  • Wie kann ich die Datei in utf-8 konvertieren? Meine Absicht ist es, jedes Format (kommt von der Quelle) in utf-8 zu konvertieren.
  • @St é phaneChazelas, @ Thomas Wie finde ich meine Quellcodierung? ' funktioniert nicht für utf- 32 (le / be) | 16 (le / be). Gibt es einen Befehl zum Suchen der Quelldatei-Codierung?
  • Wie vorgeschlagen, hilft das Anzeigen eines Oktal-Dumps mit Ratschlägen …
  • @St é phaneChazelas Das Folgende hat funktioniert, aber was bedeutet " NUL " ist es gut zu entfernen? cat filename.csv | tr -d ' \ 000 ' > out.csv-Datei -bi out.csv Text / Klartext; charset = utf-8
  • @WilliamR, diese NUL-Bytes in Ihrer CSV-Datei sind wahrscheinlich ein Hinweis auf ein größeres Problem, da die Datei auf irgendeine Weise beschädigt wurde, da diese in der Textdatei nicht erwartet werden ' ist das, worauf Sie achten sollten. Überprüfen Sie, wo sie in der CSV-Datei angezeigt werden (sollte jedoch in vim als ^@ 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

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.