Converteer binaire codering die kop en Kladblok kunnen lezen naar UTF-8

Ik heb een CSV-bestand dat zich in een binaire tekenset bevindt, maar ik moet converteren naar UTF- 8 om te verwerken in HDFS (Hadoop).

Ik heb het onderstaande commando gebruikt om de tekenset te controleren.

file -bi filename.csv 

Uitvoer:

application/octet-stream; charset=binary 

wanneer ik het bestand probeer te converteren van binair naar UTF-8, wordt er een fout gegenereerd.

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 iemand me alsjeblieft helpen begrijpen of het mogelijk is om te converteren of niet, ik kan de gegevens zien met het head-commando.

Wat betekent het, binair betekent niet-leesbaar, maar hoe head command of notepad kan de gegevens lezen.

od -tc < bestandsnaam.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 

Reacties

  • Kun je voeg alsjeblieft de uitvoer van od -tc < yourfile.csv | head toe aan je vraag?
  • bestand -bi toont zijn binaire karakter. Wanneer ik vanuit Vi controleer, toont set characterencoding utf-8.
  • Die od uitvoer toont een UTF-8-bestand met stuklijst. Om file binair te laten rapporteren, moeten er enkele niet-tekstuele tekens (waarschijnlijk ten minste één NUL-byte gevolgd door enkele niet-NUL-bytes) voorbij die eerste sectie zijn.
  • Ik heb alle " NUL " verwijderd nadat dat bestand -bi wordt weergegeven als utf-8, Ik hoop dat NUL " zal geen probleem zijn.

Antwoord

” binary “isn” t an codering (character-set name ). iconv heeft een coderingsnaam nodig om zijn werk te doen.

Het file -hulpprogramma geeft geen bruikbare informatie als het het bestandsformaat niet herkent. zou bijvoorbeeld UTF-16 kunnen zijn, zonder een byte-encoding-mark (BOM). notepad leest dat. Hetzelfde geldt voor UTF-8 (en head zou dat weergeven aangezien uw terminal mogelijk is ingesteld op o UTF-8-codering, en het zou niet schelen over een stuklijst).

Als het bestand UTF-16 is, zou je terminal dat weergeven met head omdat de meeste tekens zouden ASCII (of zelfs Latin-1) zijn, waardoor de “andere” byte van de UTF-16-tekens een nul wordt.

In beide gevallen zal het ontbreken van BOM (afhankelijk van de versie van file) verwarren. Maar andere programmas kunnen werken, omdat deze bestandsindelingen kunnen worden gebruikt met Microsoft Windows en met draagbare applicaties die op Windows kunnen worden uitgevoerd.

Om het bestand naar UTF-8 te converteren, moet u weten welke codering het gebruikt, en wat de naam is voor die codering met iconv. Als het al UTF-8 is, is het optioneel of u een stuklijst toevoegt (aan het begin). UTF-16 heeft twee smaken, volgens welke byte de eerste is. Of je zou zelfs UTF-32 kunnen hebben. iconv -l somt deze op:

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” en “BE” verwijzen naar little-end en big-end voor de byte-volgorde. Windows gebruikt de smaken “LE”, en iconv gaat er waarschijnlijk van uit dat voor de smaken “LE” of “BE” ontbreekt.

Je kunt dit zien aan de hand van een octaal getal (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 

Uitgaande van UTF-16LE, zou je kunnen converteren met

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

Reacties

  • Dus hoe kan ik het bestand converteren naar utf-8? Mijn bedoeling is om elk formaat (afkomstig van de broncode) naar utf-8 te converteren.
  • @St é phaneChazelas, @ Thomas hoe kan ik mijn broncodering vinden, het werkt niet ' voor utf- 32 (le / be) | 16 (le / be). Is er een commando om de codering van het bronbestand te vinden?
  • Zoals voorgesteld, zou het tonen van een octale dump helpen met advies …
  • @St é phaneChazelas Het onderstaande werkte, maar wat doet " NUL " is het goed om te verwijderen ?? cat bestandsnaam.csv | tr -d ' \ 000 ' > out.csv-bestand -bi out.csv tekst / gewoon; charset = utf-8
  • @WilliamR, die NUL-bytes in je csv-bestand zijn waarschijnlijk een indicatie van een groter probleem, alsof het bestand op de een of andere manier beschadigd was, omdat die niet verwacht worden in het tekstbestand, en dat ' s waar je naar zou moeten kijken. Kijk waar ze verschijnen in het csv-bestand (hoewel ze in vim als ^@ moeten worden weergegeven) en kijk of de gegevens eromheen geldig zijn.

Antwoord

strings (van binutils) slaagt om ” print de tekenreeksen van afdrukbare tekens in bestanden “wanneer zowel iconv als recode ook mislukt zijn, met file rapporteert de inhoud nog steeds als binaire gegevens:

$ 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 

Reacties

  • strings behoudt geen lege regels. Anders dan dat, doet het zijn werk.
  • @vulcanraven de optie -w (--include-all-whitespace) bevat nieuwe regels en wagen geeft terug,

Antwoord

https://pypi.python.org/pypi/chardet kan worden gebruikt om de codering van uw tekst te bepalen, waarna u deze kunt converteren naar wat u nodig heeft.

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

Terwijl file -i afdrukt

application/octet-stream; charset=binary 

chardet detecteert correct

ascii with confidence 1.0 

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *