Jag har en CSV-fil som är i binär teckenuppsättning men jag måste konvertera till UTF- 8 för att bearbeta i HDFS (Hadoop).
Jag har använt kommandot nedan för att kontrollera teckenuppsättning.
file -bi filename.csv
Output:
application/octet-stream; charset=binary
när jag försöker konvertera filen från binär till UTF-8 ger den fel.
iconv -f binary -t utf-8 fiename.csv iconv: conversion from binary" is not supported Try iconv --help" or iconv --usage" for more information.
kan någon snälla hjälpa mig att förstå är det möjligt att konvertera eller inte, jag kan se data med hjälp av huvudkommando.
Vad betyder det, binärt betyder icke-läsbart men hur huvudkommando eller anteckningar kan läsa informationen.
od -tc < filnamn.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
Kommentarer
Svar
” binärt ”är inte” t kodning (teckenuppsättningsnamn iconv behöver ett kodningsnamn för att utföra sitt jobb.
file
-verktyget ger inte användbar information när det inte känner igen filformatet. kan till exempel vara UTF-16
utan byte-kodningsmärke (BOM). notepad
läser det. Detsamma gäller för UTF-8
(och head
skulle visa att eftersom din terminal kan ställas in t o UTF-8-kodning, och det bryr sig inte om en BOM).
Om filen är UTF-16, visar din terminal att det använder head
eftersom de flesta karaktärerna skulle vara ASCII (eller till och med Latin-1), vilket skulle göra den ”andra” byten av UTF-16-tecknen till en null. version av file
) förväxlar den. Men andra program kan fungera, eftersom dessa filformat kan användas med Microsoft Windows såväl som bärbara applikationer som kan köras på Windows.
För att konvertera filen till UTF-8 måste du veta vilken kodning den använder och vad namnet på den kodningen är med iconv
. Om det redan är UTF-8 är det valfritt om du lägger till en BOM (i början). UTF-16 har två smaker, enligt vilka byte är först. Eller så kan du till och med ha UTF-32. iconv -l
listar dessa:
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” och ”BE” hänvisar till liten ände och stor ände för bytebeställningen. Windows använder ”LE” -smakarna och iconv
antar troligen att för smaker som saknar ”LE” eller ”BE”.
Du kan se detta med en oktal (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
Förutsatt att UTF-16LE kan du konvertera med
iconv -f UTF-16LE// -t UTF-8// <input >output
Kommentarer
- Så hur kan jag konvertera filen till utf-8, min avsikt är att konvertera vilket format som helst (kommer från källa) till utf-8.
- @St é phaneChazelas, @ Thomas hur kan jag hitta min källkodning, det fungerar inte ' för utf- 32 (le / be) | 16 (le / be). Finns det något kommando för att hitta källkodskodningen?
- Som föreslås kan det vara bra att visa en oktal dumpning …
- @St é phaneChazelas Nedan fungerade men vad fungerar " NUL " är det bra att ta bort ?? kattfilnamn.csv | tr -d ' \ 000 ' > out.csv-fil -bi out.csv text / vanlig; charset = utf-8
- @WilliamR, dessa NUL-byte i din csv-fil är förmodligen en indikation på ett större problem, som att filen var skadad på något sätt eftersom de inte förväntas i textfilen, och att ' är vad du ska titta på. Titta på var de visas i csv-filen (men ska visas som
^@
i vim) och se om informationen kring den är giltig.
Svar
strings
(från binutils) lyckas till ” skriv ut strängarna av utskrivbara tecken i filer ”när både iconv
och recode
misslyckades också med file
rapporterar fortfarande innehållet som binär data:
$ 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
Kommentarer
-
strings
behåller inte tomma rader. Bortsett från det gör det jobbet. - @vulcanraven alternativet
-w
(--include-all-whitespace
) innehåller nya linjer och transport returnerar,
Svar
https://pypi.python.org/pypi/chardet kan användas för att bestämma kodningen av din text, sedan kan du konvertera från det till vad du behöver.
pip install chardet chardetect /my/path/to/file
Medan file -i
skriver ut
application/octet-stream; charset=binary
chardet
upptäcker korrekt
ascii with confidence 1.0
od -tc < yourfile.csv | head
till din fråga?od
-utmatningen visar en UTF-8-fil med BOM. För attfile
ska kunna rapportera binärt måste det finnas några tecken som inte är text (sannolikt minst en NUL-byte följt av några icke-NUL-byte) förbi det första avsnittet.