Laden...

File.ReadLines in UTF8

Letzter Beitrag vor einem Jahr 6 Posts 566 Views
File.ReadLines in UTF8

Hallo!

Ich möchte die Zeilen einer CSV-Datei einlesen und die Kodierung der Zeilen "erhalten".

Zum Problem...

Die erste Zeile meiner CSV-Datei hat eine (UTF-8) BOM-Kennung (EFBB BF) gefolgt von Semikolon separierten Spalten-Namen.

Die erste Spalte heißt BOM, danach ID, Anlass usw. .  Siehe Bild.

Die Zeilen lese ich über File.ReadLines mit Angabe der Kodierung (UTF-8) ein:

foreach (string Zeile in File.ReadLines(PfadDateiname, Kodierung))
{
    ...
}

Das Problem ist, dass die BOM-Kennung selbst, im 1. Zeile-String nicht enthalten ist!

Zeile: BOM;ID;Anlass;P...   (Nur die Spalten-Namen)

Umlaute in den Spalten-Namen (und an anderen Stellen) werden korrekt kodiert (ä,ü,ö...).

Ich möchte, wie im Bild, für die erste Zeile den String:  i>>?BOM;ID;Anlass... (BOM-Zeichen kann ich hier nicht korrekt darstellen)

Wie kann ich das erreichen?

Mir ist nicht ganz klar was du machen willst.
Willst du die Bytes des BOM mit auslesen?
Dann müsstest du als Kodierung Utf8Encoding selbst instanzieren und mitgeben.
Dort kannst du dann im Konstruktor mitgeben ob die BOM Bytes mitgelesen werden sollen.
Macht aber kaum Sinn die zu lesen, da diese dann auch selbst beim verarbeiten aussieben müsstest, was .NET hier schon für dich macht.
Beim schreiben der Daten, kannst du dann Utf8Encoding wieder mit passenden Parametern mitgeben damit die BOM Bytes wieder geschrieben werden.

Doku:
https://learn.microsoft.com/de-de/dotnet/api/system.text.utf8encoding?view=net-7.0

T-Virus

Developer, Developer, Developer, Developer....

99 little bugs in the code, 99 little bugs. Take one down, patch it around, 117 little bugs in the code.

Hallo perlfred

Die "Byte Order Mark" ist nicht Teil der Daten. Sie wird Dateien vorangestellt um die Byte-Reihenfolge im Dokument anzuzeigen. Siehe Wikipedia: https://de.wikipedia.org/wiki/Byte_Order_Mark

Das BOM wird also von File.ReadLines korrekterweise nicht mit zurückgegeben.

Gruss
Alf

PS:
Es wird UTF-8 nicht empfohle das BOM zu benutzen, kommt aber trotzdem vor:
https://stackoverflow.com/questions/2223882/whats-the-difference-between-utf-8-and-utf-8-with-bom/2223926#2223926)

Hallo T-Virus!

Ja, ich möchte zur Anzeige (TextBlock) der ersten 10 Zeilen der CSV-Datei, die BOM-Kennung mit anzeigen.

Eine Instanzierung der Kodierung ändert leider nichts. Es werden nur die Spalten-Namen (ohne BOM-Kennung) angezeigt.

Kodierung = new UTF8Encoding(false);

foreach (string Zeile in File.ReadLines(PfadDateiname, Kodierung))

Ergibt Zeile: BOM;ID;Anlass;P...

Da hat Alf Artor bestimmt recht, dass der BOM bereits von ReadLines nicht zurückgegeben wird.

Was die Frage aufwirft, wie bekomme ich die Zeilen als vollständigen String zurück.

Was ich auch nicht verstehe, die reine BOM-Kennung bekomme ich nicht als String:

private string BOMKennung { get; } = Encoding.UTF8.GetString(new byte[] { 0xEF, 0xBB, 0xBF });

Ergibt einen Leer-String!???

Hallo Alf Ator!

Du hast schon recht... Zur ersten Zeile gehört bei mir zur Anzeige die BOM-Kennung aber mit dazu.

Ich werde es jetzt mal mit einer binären Einlesung versuchen.

Vielen Dank für deine Hinweise!

Hallo!

Mit einem binären Einlesen bin ich jetzt ans Ziel gekommen, aber ich werde die BOM-Kennung separat behandeln, da ich die Kodierung der gesamten CSV-Datei dann doch lieber dem ReadLines mit Angabe der Kennung überlasse.

byte[] fileBytes = File.ReadAllBytes(PfadDateiname);
StringBuilder sb = new();
foreach (byte b in fileBytes) { sb.Append(Convert.ToChar(b)); }

Ergibt:  ï»¿BOM;ID;Anlass;PLZ;Or...

|

Die BOM-Kennung als String erhalte ich über:

private string BOMKennung { get; } = new string(new char[] { Convert.ToChar(0xEF), Convert.ToChar(0xBB), Convert.ToChar(0xBF) });

Danke für die vielen Hinweise!!!