[C#]Datei auslesen Fortschirtt

06/26/2013 22:21 Else#16
Quote:
Originally Posted by AT0MiX View Post
eigentlich nicht.

Was spricht gegen Zeilen!?
Z.b., wenn es sich um NICHT Text-Dateien handelt? Mit einem Byte-Array bist Du auf jedem Weg flexibler. ;-)
06/26/2013 22:52 GodHacker#17
Quote:
Originally Posted by Else View Post
Z.b., wenn es sich um NICHT Text-Dateien handelt? Mit einem Byte-Array bist Du auf jedem Weg flexibler. ;-)
Ich werde immer nur Dateien lesen, die ich zeilenweise brauche.
Trotzdem guter Hinweis.
06/29/2013 13:03 MrSm!th#18
Quote:
Originally Posted by AT0MiX View Post
eigentlich nicht.

Was spricht gegen Zeilen!?
Und wie auch schon an den oberen Posts entnommen werden kann, ist eine ProgressBar bei einer Datei die kleiner als 100 MB (und ich glaube kaum, dass du eine 100 MB Datei auslesen willst) unnötig.
Naja für dieses konkrete Problem sind Zeilen in der Tat schwieriger. Die Größe der Datei in Bytes kannst du leicht abfragen, aber frag mal die Zeilenanzahl ab, die du für die Fortschrittsanzeige brauchtest.
06/29/2013 17:25 GodHacker#19
Quote:
Originally Posted by MrSm!th View Post
Naja für dieses konkrete Problem sind Zeilen in der Tat schwieriger. Die Größe der Datei in Bytes kannst du leicht abfragen, aber frag mal die Zeilenanzahl ab, die du für die Fortschrittsanzeige brauchtest.
Genau das ist mein Problem.
06/29/2013 18:06 .SkyneT.#20
Quote:
Originally Posted by MrSm!th View Post
aber frag mal die Zeilenanzahl ab, die du für die Fortschrittsanzeige brauchtest.
Auch kein Problem, nur müsste man vorher die Datei durchgehen,
um zu wissen wieviele Zeilen es gesamt sind. -> Toll für die Performance
06/29/2013 18:27 Else#21
D.h. Bytes auslesen => Ruhe.
06/30/2013 00:49 GodHacker#22
Quote:
Originally Posted by .SkyneT. View Post
Auch kein Problem, nur müsste man vorher die Datei durchgehen,
um zu wissen wieviele Zeilen es gesamt sind. -> Toll für die Performance
Würde auch ziemlich blöd sein, weil wenn ich sie einmal durchgehe, dann kann ich sie auch direkt lesen. Sollte ja nicht doppelt duchlaufen werden.

Quote:
Originally Posted by Else View Post
D.h. Bytes auslesen => Ruhe.
Ich gebe dir gerne ein Beispiel, damit du verstehst, warum ich ZEILEN möchte.
Ich habe eine *.txt-Datei, welche ca. 2,6MB groß ist und ungefähr 136000 Proxys beinhaltet. Hier ist es natürlich viel schöner, wenn ich einfach Zeile für Zeile in eine List<> speichere (jedenfalls ist das meine Meinung).
Jetzt gib mir mal einen Beispiel Code, wie ich dies mit einer Progressbar mache.
06/30/2013 01:34 Requi#23
Quote:
Originally Posted by GodH@cker
Würde auch ziemlich blöd sein, weil wenn ich sie einmal durchgehe, dann kann ich sie auch direkt lesen. Sollte ja nicht doppelt duchlaufen werden.
Er meinte, im Programm die datei durchgehen. So gesehen, die Zeilen zählen :p

In AutoIt:
Code:
Func _FileCountLines($sFilePath)

	Local $hFile = FileOpen($sFilePath, $FO_READ)
	If $hFile = -1 Then Return SetError(1, 0, 0)
	Local $sFileContent = StringStripWS(FileRead($hFile), 2)
	FileClose($hFile)
	Local $aTmp
	If StringInStr($sFileContent, @LF) Then
		$aTmp = StringSplit(StringStripCR($sFileContent), @LF)
	ElseIf StringInStr($sFileContent, @CR) Then
		$aTmp = StringSplit($sFileContent, @CR)
	Else
		If StringLen($sFileContent) Then
			Return 1
		Else
			Return SetError(2, 0, 0)
		EndIf
	EndIf
	Return $aTmp[0]
EndFunc   ;==>_FileCountLines
06/30/2013 02:15 dready#24
So aus dem stehgreif hast wohl folgende Optionen.

a)
Du brauchst für 2,6 mb keine Progressbar .. blend in deiner gui ein das es läd bis das ganze durch is, seh bei 2,6mb ehrlichgesagt keinen Großen Sinn darin.

b) Lad die Datei als Bytearray, dort ist es trivial eine Progressbar zu machen, danach arbeitest du mit den Daten im Bytearray. Perfomancetechnisch sicher nicht optimal, aber nachdem die Datei erstmal im Speicher ist dürfte das nurnoch bei wirklich extrem Perfomancenkritischen Sachen nen Problem geben, wofür C# eh nich so super geeigenet wäre.

c) Bau dir ein Mini Dateiformat das eine Saubere Struktur hat.
Sorg dafür das die Ipadressen immer die selbe Menge an Bytes einnehmen, danach ist es trivial sie eine nach der Anderen auszulesen und den Prozentualen Fortschritt zu errechnen.

Gibt sicher noch unmengen andere Wege.

Source bekommst von mir aber nicht, das ganze ist ne schöne Grundlagenübung, gibt man hier den Code raus wird eh nur c&p, wovon am ende keiner was hat, das ganze ist einfach nicht so komplex das man Codebeispiele zum erklären bräuchte.
06/30/2013 12:36 .SkyneT.#25
Quote:
Originally Posted by GodHacker View Post
[...]
Hier ist es natürlich viel schöner, wenn ich einfach Zeile für Zeile in eine List<> speichere (jedenfalls ist das meine Meinung).
[...]
Du gehst die Datei durch, währenddessen aktualisierst du nach
jedem Byte die Progressbar, und nach jeder Zeile schreibst du nen
neuen Eintrag in deine Liste.
So hast du ne Progressbar die sich füllt während die Datei
durchlaufen wird.

Quote:
Originally Posted by dready View Post
[...]
c) Bau dir ein Mini Dateiformat das eine Saubere Struktur hat.
Sorg dafür das die Ipadressen immer die selbe Menge an Bytes einnehmen, danach ist es trivial sie eine nach der Anderen auszulesen und den Prozentualen Fortschritt zu errechnen.
[...]
Dann müsste er jede Liste in sein Dateiformat "konvertieren", was Schwachsinn ist.
06/30/2013 22:20 MrSm!th#26
Quote:
b) Lad die Datei als Bytearray, dort ist es trivial eine Progressbar zu machen, danach arbeitest du mit den Daten im Bytearray. Perfomancetechnisch sicher nicht optimal, aber nachdem die Datei erstmal im Speicher ist dürfte das nurnoch bei wirklich extrem Perfomancenkritischen Sachen nen Problem geben, wofür C# eh nich so super geeigenet wäre.
Eigentlich sollte es sogar schneller sein, die Datei im Ganzen zu lesen und dann mit dem Speicher zu arbeiten, als jede Zeile einzeln zu lesen.

Btw. wenn es unbedingt Zeile für Zeile sein soll, kann man es ja auch folgendermaßen machen:
Die Größe der Datei in bytes ist leicht abzufragen. Du liest die Datei in Zeilen aus, addierst die Längen in Bytes jeder Zeile auf und hast dann halt das Verhältnis dieser Summe zur Gesamtgröße als Fortschritt. Wird trotzdem ziemlich schnell auf 100 sein.
06/30/2013 22:55 GodHacker#27
Ich werds mal mit bytes testen und sehe ja dann, ob es gut geht.
07/01/2013 10:22 dready#28
@Skynet, jub hast recht, hab mich bescheiden ausgedrückt, wollte es mit Anmerken da es die Einzige Option ist wenn er mit der Tatsächlichen Menge an eingelesenen Ip´s arbeiten will, wenn aber wer ne bessere option hat, her damit :)