Entwickler-Ecke

Basistechnologien - Anzahl Zeilen von UTF8-Datei ermitteln


haschme - Mi 14.09.16 13:54
Titel: Anzahl Zeilen von UTF8-Datei ermitteln
Hallo zusammen,

in meinem derzeitigen Projekt ermittel ich unter anderem die Anzahl an Zeilen von Eingabedateien.
Alle Zeilen der Eingabedateien sind immer gleich lang.

Daher habe ich mir immer die Gesamtanzahl an Bytes per Fileinfo.Length zurückgeben lassen
und die Zeilenlänge der ersten Zeile per Readline ermittelt.

Danach habe ich einfach mit (Gesamtbytezahl / Zeilenlänge) die Anzahl an Zeilen ermittelt.

Dies hat bei ASCII und ANSI codierten Dateien bisher immer wunderbar geklappt.
Jetzt wollte ich das ganze mal auf UTF-8 erweitern.

Wenn ich dabei genauso vorgehe bekomme ich allerdings nicht die korrekte Anzahl an Zeilen zurückgeliefert.

Kennt eventuell jemand den Grund bzw. kennt jemand vielleicht eine Möglichkeit wie ich an die Anzahl der Zeilen bei einer UTF-8 codierten Datei komme?
(Eine Möglichkeit bei der ich nicht jede Zeile erst lesen muss und dann einen Counter hochzähle)

ps.: Die UTF-8 Datei ist mit BOM

Vielen Dank und liebe Grüße!


Th69 - Mi 14.09.16 14:13

Hallo,

die Antwort ist ja wohl klar, denn ein UTF-8 Zeichen kann ja aus 1 bis 4 Bytes bestehen, also kann die Zeilenlänge (in Bytes) jeweils unterschiedlich sein.

Ist die Datei denn so groß, sonst lies doch einfach per

C#-Quelltext
1:
2:
3:
string[] lines = File.ReadAllLines(filename);

int count = lines.Length;
?


haschme - Mi 14.09.16 14:19

Danke für die schnelle Antwort!

Naja übermäßig groß ist die Datei nicht.
Habe es jetzt auch erstmal mit ReadAllLines gemacht, aber hatte gehofft, dass es vielleicht doch eine schönere Lösung gibt.
Wenn dann doch mal eine große Datei eingelesen werden soll wäre das natürlich nicht so elegant.


Ralf Jansen - Mi 14.09.16 14:41

Wenn du ein anderes Format brauchst das einen größeren Zeichenvorrat als ANSI hat und dazu fixe Länge (für dein ~schnelles~ Verfahren) dann bleibt utf-32.


Th69 - Mi 14.09.16 15:36

Aber auch UTF-32 kann Probleme machen (insb. wenn du alle möglichen Sprachen unterstützen willst), s.a. UTF-32 [https://de.wikipedia.org/wiki/UTF-32] (sowie den englischen Artikel dazu), denn ein Unicode Code Point entspricht nicht immer exakt einem Schriftzeichen.


Ralf Jansen - Mi 14.09.16 16:13

Ähm nach der Transformation Unicode(wo ich codepoints habe) -> Bytedarstellung (halt ins Unicode Transformation Format kurz UTF) habe ich bei utf-32 immer 4Bytes egal wieviele codepoints die in Unicode hatten. Oder hab ich was verpasst bzw. missverstanden :gruebel:

Edit : Ok gerade das Beispiel mit den Ligaturen gesehen.