Konverter binær koding som hodet og Notisblokk kan lese til UTF-8

Jeg har en CSV-fil som er i binært tegnsett, men jeg må konvertere til UTF- 8 for å behandle i HDFS (Hadoop).

Jeg har brukt kommandoen nedenfor for å sjekke tegnsett.

file -bi filename.csv 

Utgang:

application/octet-stream; charset=binary 

når jeg prøver å konvertere filen fra binær til UTF-8, kaster den feil.

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 noen hjelpe meg med å forstå er det mulig å konvertere eller ikke, jeg kan se dataene ved hjelp av hodekommandoen.

Hva betyr det, binært betyr ikke-lesbart, men hvordan hodekommando eller notisblokk kan lese dataene.

od -tc < filnavn.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 vennligst legg til utgangen av od -tc < yourfile.csv | head til spørsmålet ditt?
  • fil -bi viser sin binære karakter, når jeg sjekker fra Vi angir tegnkoding viser utf-8.
  • At od -utgangen viser en UTF-8-fil med BOM. For at file skal rapportere binært, må det være noen ikke-teksttegn (sannsynligvis minst en NUL-byte etterfulgt av noen ikke-NUL-byte) forbi den første delen.
  • Jeg har fjernet alle " NUL " etter at filen -bi vises som utf-8, håper jeg fjerner " NUL " vil ikke være et problem.

Svar

» binær «er ikke en koding (tegnsettnavn iconv trenger et kodingsnavn for å gjøre jobben sin.

file verktøyet gir ikke nyttig informasjon når det ikke gjenkjenner filformatet. kan for eksempel være UTF-16 uten byte-kodingsmerke (BOM). notepad leser det. Det samme gjelder UTF-8 (og head vil vise det siden terminalen din kan være satt t o UTF-8-koding, og det bryr seg ikke om en BOM).

Hvis filen er UTF-16, vil terminalen din vise at du bruker head fordi de fleste tegnene vil være ASCII (eller til og med Latin-1), noe som gjør den «andre» byten til UTF-16-tegn til null.

I begge tilfeller vil mangelen på stykklisten (avhengig av versjon av file) forvirrer det. Men andre programmer kan fungere, fordi disse filformatene kan brukes med Microsoft Windows, så vel som bærbare applikasjoner som kan kjøres på Windows.

For å konvertere filen til UTF-8, må du vite hvilken koding den bruker, og hva navnet på den kodingen er med iconv. Hvis det allerede er UTF-8, er det valgfritt om du legger til en BOM (i begynnelsen). UTF-16 har to smaker, ifølge hvilke byte er først. Eller du kan til og med ha UTF-32. iconv -l lister opp disse:

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» og «BE» refererer til liten ende og stor ende for byteordren. Windows bruker «LE» -smakene, og iconv antar sannsynligvis at for smakene som mangler «LE» eller «BE».

Du kan se dette ved å bruke 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 

Forutsatt at UTF-16LE kan du konvertere ved hjelp av

iconv -f UTF-16LE// -t UTF-8// <input >output 

Kommentarer

  • Så hvordan kan jeg konvertere filen til utf-8, min intensjon er å konvertere hvilket som helst format (kommer fra kilde) til utf-8.
  • @St é phaneChazelas, @ Thomas hvordan kan jeg finne kildekodingen min, det fungerer ikke ' for utf- 32 (le / be) | 16 (le / be). Er det noen kommando for å finne kildekodekodingen?
  • Som foreslått, kan det være råd å vise en oktal dump …
  • @St é phaneChazelas Nedenfor fungerte, men hva gjør " NUL " er det bra å fjerne ?? kattens filnavn.csv | tr -d ' \ 000 ' > out.csv-fil -bi out.csv tekst / vanlig; charset = utf-8
  • @WilliamR, disse NUL-bytene i csv-filen din er sannsynligvis en indikasjon på et større problem, som om filen ble ødelagt på noen måte, ettersom de ikke forventes i tekstfilen, ' er det du bør se på. Se på hvor de vises i csv-filen (men skal vises som ^@ i vim) og se om dataene rundt den er gyldige.

Svar

strings (fra binutils) lykkes til » skriv ut strengene med utskrivbare tegn i filer «når både iconv og recode også mislyktes, med file rapporterer fortsatt innholdet som binære 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 bevarer ikke tomme linjer. Annet enn det gjør den jobben.
  • @vulcanraven alternativet -w (--include-all-whitespace) inkluderer nye linjer og vogn returnerer,

Svar

https://pypi.python.org/pypi/chardet kan brukes til å bestemme kodingen av teksten din, så kan du konvertere fra det til det du trenger.

 pip install chardet chardetect /my/path/to/file  

Mens file -i skriver ut

application/octet-stream; charset=binary 

chardet registrerer riktig

ascii with confidence 1.0 

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *