Von UTF-16LE nach UTF-8 convertieren

Interessantes ohne bestimmtes Thema!

Moderator: student

Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Von UTF-16LE nach UTF-8 convertieren

Beitrag von Aaron »

Da duckdb nur csv files mit UTF-8 Kodierung lesen kann, versuche ich die csv files, welche wahrscheinlich UTF-16LE sind nach UTF-8 zu konvertieren. Ich habe jetzt schon viel herumprobiert. Leider ohne Erfolg. Als Beispiel eine csv Datei ohne Header mit dem Namen 5.csv:

iconfig

Code: Alles auswählen

iconv -f UTF-16LE -t utf8 5.csv > 5a.csv
iconv: incomplete character or shift sequence at end of buffer

$ file -i 5.csv
5.csv: application/octet-stream; charset=binary 
dos2linux

Code: Alles auswählen

dos2unix -ul -n 5.csv  5a.csv
dos2unix: converting UTF-16LE file 5.csv to UTF-8 file 5a.csv in Unix format...

$ file -i 5a.csv
5a.csv: text/plain; charset=utf-8
Es wird zwar angezeigt, dass richtig konvertiert wurde, aber head -n10 5a.csv zeigt nur ㌀ഀ਀ 㘀⼀㄀㌀⼀

vim

Code: Alles auswählen

vi -es '+set fileencoding=utf-8' '+wq!' 5.csv

$ file -i 5.csv
5.csv: application/octet-stream; charset=binary 
Dateianhänge
screenshot
screenshot
5.csv
csv Datei
(4.67 MiB) 11-mal heruntergeladen
LG,
Aaron
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Athomas »

die csv files, welche wahrscheinlich UTF-16LE sind
Was lässt Dich das glauben?
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Athomas »

Es ist nicht UTF-16LE, sondern UTF-16BE und es heißt im Konvertierungsbefehl wohl nicht "utf8" sondern "UTF-8":

Code: Alles auswählen

iconv -f UTF-16BE -t UTF-8 5.csv > 5a.csv
Bevor sich jemand wundert: wir haben inzwischen R verlassen...
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von bigben »

Athomas hat geschrieben: Di Nov 14, 2023 11:33 pmBevor sich jemand wundert: wir haben inzwischen R verlassen...
Hallo, ich hatte den Thread erst mal stehen lassen, denn grundsätzlich könnte man das Problem sicher auch in R lösen. base enthält eine Funktion base::iconv die da als Anfang hilfreich sein könnte. Angesichts des Datenumfangs ist das in der Konsole sicher besser aufgehoben und wenn nicht mal Athomas mit einer stringi Lösung um die Ecke kommt, verschiebe ich den Thread jetzt mal in den Off topic Bereich.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Aaron »

Vielen Dank für die Hilfe.

Meine Lösung sieht jetzt so aus:

Code: Alles auswählen

# Convert the files from UTF-16BE to UTF-8
find . -name "*.csv" -exec sh -c "iconv -f UTF-16BE -t UTF-8 '{}' > '{}'.utf8" \; -exec sh -c "mv '{}.utf8' '{}'" \;
LG,
Aaron
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von bigben »

Hallo Aaron,

mich würde aus Neugierde mal interessieren, wie lange so eine Umkodierung für eine 200GB-Datei in etwa dauert. Ganz grob. Ich habe gar keine Vorstellung davon.

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Aaron »

Hallo Bernhard,

Die Umkodierung dauert ca. 3 Minuten. Ich muss dazu sagen, das ich zu Testzwecken einen VS-Server verwende. Wenn ich alle Berechnungen in R laufen, dann gibt es einen Rechner mit entsprechender Leistung.
CPU: 4 vCore
RAM: 8 GB
SSD: 160 GB
Zuletzt geändert von Aaron am Mi Nov 15, 2023 1:47 pm, insgesamt 4-mal geändert.
LG,
Aaron
Athomas
Beiträge: 769
Registriert: Mo Feb 26, 2018 8:19 pm

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Athomas »

mich würde aus Neugierde mal interessieren, wie lange so eine Umkodierung für eine 200GB-Datei in etwa dauert.
Ist das lustig oder erschreckend - ich wollte genau diese Frage auch stellen :D !

@Aaron: Auf was für einer Maschine rechnest Du: Prozessor(en)/"Festplatte"?

Ich hatte mit DuckDB Experimente auf meinem ollen R-Server (2 x 14 Kerne Xeon mit 2.0 GHz und NVMe-SSD) gemacht, da war es eine Freude zu beobachten, wie DuckDB alle 56 Threads unter Dampf hielt...
bigben
Beiträge: 2781
Registriert: Mi Okt 12, 2016 9:09 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von bigben »

Hallo,
Aaron hat geschrieben: Mi Nov 15, 2023 1:25 pmDie Umkodierung dauert ca. 3 Minuten. [...]
CPU: 4 vCore
RAM: 8 GB
SSD: 160 GB
Du kopierst 200GB utf-16 in eine utf-8 Datei und das alles auf einer Platte, die nur 160 GB hat? Ich vermute, die 3 Minuten beziehen sich auf einen kleineren Testfall?
Athomas hat geschrieben: da war es eine Freude zu beobachten, wie DuckDB alle 56 Threads unter Dampf hielt...
Meine naive Vermutung war, dass der Plattenzugriff und nicht die Anzahl der Kerne/Threads der Flaschenhals ist. Hast Du da aufwändige Rechnungen betrieben, an denen der Computer länger rechnet als er auf die SSD schreibt, oder sind meine Vorstellungen falsch und stammen noch von der Datasette?

LG,
Bernhard
---
Programmiere stets so, dass die Maxime Deines Programmierstils Grundlage allgemeiner Gesetzgebung sein könnte
Aaron
Beiträge: 20
Registriert: Di Nov 07, 2023 9:11 am

Re: Von UTF-16LE nach UTF-8 convertieren

Beitrag von Aaron »

Entschuldige bitte, natürlich, es war nur ein Testfall. Die csv Datei hatte eine Größe von 2GB.
LG,
Aaron
Antworten