Verarbeiten Sie eine Datei, die mit einer Stückliste beginnt (FF FE).


10

Ich habe eine CSV-Datei mit der FF FEStückliste erhalten:

$ head -n1 dotan.csv | hd
00000000  ff fe 41 00 64 00 20 00  67 00 72 00 6f 00 75 00  |..A.d. .g.r.o.u.|

Beim awkParsen erhalte ich eine Reihe von Null-Bytes, was vermutlich auf die Bytereihenfolge zurückzuführen ist. Wie kann ich die Bytereihenfolge für diese Datei (mithilfe der CLI) austauschen, damit normale Tools damit arbeiten?

Beachten Sie, dass ich denke, dass diese Datei nur aus ASCII-Zeichen besteht (mit Ausnahme der Stückliste), aber ich kann dies nicht bestätigen, da ich grepdenke, dass es sich um eine Binärdatei handelt:

$ grep -P '^[\x00-\x7f]' dotan.csv 
Binary file dotan.csv matches

Wenn Sie in VIM nach derselben Zeichenfolge suchen, werden alle Zeichen angezeigt!

Durch iconvdie Konvertierung in ASCII werden \ x00-Werte nicht entfernt, sondern das Problem wird noch schlimmer, da sie jetzt wie Null-Bytes anstelle von UTF-8 aussehen!

$ iconv -f UTF-8 -t ASCII dotan.csv > fixed.txt 
iconv: illegal input sequence at position 0

$ iconv -f UTF-8 -t ASCII//IGNORE dotan.csv > fixed.txt

$ head -n1 fixed.txt | hd
00000000  41 00 64 00 20 00 67 00  72 00 6f 00 75 00 70 00  |A.d. .g.r.o.u.p.|

Wie kann ich die Bytereihenfolge für diese Datei (mithilfe der CLI) austauschen, damit normale Tools damit arbeiten?


Die CSV-Datei, die Sie unter Windows oder Mac erstellt haben?
Cuonglm

Können Sie einen Teil der Datei geben?
Cuonglm

Hier ist ein Link zu einem anonymisierten Teil der Datei, der die einzigartigen Probleme damit bewahrt. Danke!
Dotancohen

Antworten:


15

Von diesem Wikipedia - Artikel , FF FEbedeutet UTF16LE. Sie sollten also anweisen iconv, von UTF16LEzu konvertieren UTF8:

iconv -f UTF-16LE -t UTF-8 dotan.csv > fixed.txt

Perfekt, danke! Ich hatte die Stücklisten UTF-8 und UTF-16 verwechselt: Ich dachte, dass FFFE und FEFF UTF-8 sind, und ich kannte die Stücklisten UTF-16 nie. Eigentlich sind das UTF-16-Stücklisten, und ich habe die (nutzlose) UTF-8-Stückliste nie gekannt!.
Dotancohen

@dotancohen: Ich teste in meinem Fedora und die tailLösung funktioniert gut. Welches Betriebssystem verwenden Sie?
Cuonglm

Dies funktioniert nicht (dh entfernen Sie die Stückliste) für die Version "iconv (GNU libiconv 1.14)" in Git Bash unter Windows. Aber (aus welchem ​​Grund auch immer) funktioniert es, nur UTF-16anstelle einer der Versionen mit Bytereihenfolge zu arbeiten.
Kenny Evitt

3

dos2unix entfernt auch Stücklisten und konvertiert UTF-16 in UTF-8:

$ printf %s あ|recode ..utf16 >a;xxd -p a;dos2unix a;xxd -p a
feff3042
dos2unix: converting file a to Unix format...
e38182

dos2unix entfernt auch UTF-8-Stücklisten:

$ printf %b '\xef\xbb\xbfa'>a;dos2unix a;xxd -p a
dos2unix: converting file a to Unix format...
61

0

Auch auf StackOverflow beantwortet: Wie kann ich die Stückliste aus einer UTF-8-Datei entfernen? @rici hat eine gute Antwort.

Kurze Antwort:

  • Kurze Antwort : sed -i $'1s/^\uFEFF//' file.txt, aber nicht unter BSD oder OS / X.
  • Eine andere Antwort: vi file.txt, :set nobomb, :w, einfache , aber Handbuch
  • Installieren Sie dos2unuix; dos2unix -r file.txt
  • Diese Markierungen haben mehrere mögliche Bedeutungen, einschließlich der Tatsache, dass die Datei UTF-8 ist. siehe den Wikipedia-Artikel .
  • Windows-Programme lieben es, diese Markierungen hinzuzufügen. Die meisten Editoren entfernen diese Markierungen nicht.
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.