Konvertera binär kodning som huvudet och Anteckningar kan läsa till UTF-8

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

  • Kan du lägg till utdata från od -tc < yourfile.csv | head till din fråga?
  • fil -bi visar dess binära karaktär, när jag kontrollerar från Vi ställer teckenkodning utf-8.
  • Att od -utmatningen visar en UTF-8-fil med BOM. För att file 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.
  • Jag har tagit bort alla " NUL " efter att filen -bi visas som utf-8, hoppas jag tar bort " NUL " kommer inte att vara ett problem.

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 

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *