Autor Beitrag
haschme
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57
Erhaltene Danke: 1



BeitragVerfasst: Mi 14.09.16 13:54 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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
ausblenden C#-Quelltext
1:
2:
3:
string[] lines = File.ReadAllLines(filename);

int count = lines.Length;
?

Für diesen Beitrag haben gedankt: haschme
haschme Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57
Erhaltene Danke: 1



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.

Für diesen Beitrag haben gedankt: haschme
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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 (sowie den englischen Artikel dazu), denn ein Unicode Code Point entspricht nicht immer exakt einem Schriftzeichen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4700
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: 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.