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
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
od -tc < yourfile.csv | head
toe aan je vraag?od
uitvoer toont een UTF-8-bestand met stuklijst. Omfile
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.