Autoit Daten aus Datei Lesen

06/27/2009 22:13 Dung3on#1
Hallo,
ich hab mal eine Frage.
Ich habe eine Datei an die 300kb groß. Es sind alles einträge die mit einem ";" abgetrennt sind. Sie stehen alle in einer Line zusammen.

Quote:
$file = FileOpen("bla", 0)
$xy = StringSplit(FileReadLine($file), ";")
FileClose($file)
So komm ich aber nicht an alle Einträge herran, weil die Variable einfach zu groß wird.
Wenn Jemand einen Rat weiß wäre ich sehr dankbar.

Mfg Dung3on
06/27/2009 22:24 °Remus°#2
mit UBound kannst du die größe/dimension des arrays rausfinden und dann einfach mit ner for schleife entsprechend abarbeiten
06/27/2009 22:33 Dung3on#3
Das Problem ist aber, dass nicht alle einträge ( Also Arrays ) In die Variable gehen weils zu viele sind. Er nimmt nur ca. 6000 auf obwohl es über 15000 sein müssten.

Es müsste eine Möglichkeit geben die Daten i-wie in 1000er Päckchen auszulesen, ohne die Datei vorher komplett in eine Variable als String bzw. als Arrays, zu packen.
Sonst wüsst ich nicht wie...
06/28/2009 09:51 invisible#4
#moved zum autoit bereich
06/28/2009 10:49 °Remus°#5
mhh für mich sieht das ziemlich nach nem programm aus was ne password liste abarbeitet um accounts zu klauen, ich hab schon nen paar ideen wie du es machen könntest aber sag bitte erstma was das werden soll oder poste am besten gleich den ganzen sourcecode
06/28/2009 17:10 Dung3on#6
Also mit dem Sourcecode wirds was schwer, hat über 1000 Zeilen ;)
Aber ich sag euch wofür ich das brauche. Suchfunktion :)


Quote:

$file = FileOpen("libraries/stadt.txt", 0)
$stadtkom = StringSplit(FileReadLine($file), ";")
FileClose($file)

$file1 = FileOpen("libraries/groesse.txt", 0)
$groessekom = StringSplit(FileReadLine($file1), ";")
FileClose($file1)

$file2 = FileOpen("libraries/spieler.txt", 0)
$spielerkom = StringSplit(FileReadLine($file2), ";")
FileClose($file2)

$file3 = FileOpen("libraries/punkte.txt", 0)
$punktekom = StringSplit(FileReadLine($file3), ";")
FileClose($file3)

$file4 = FileOpen("libraries/allianz.txt", 0)
$allianzkom = StringSplit(FileReadLine($file4), ";")
FileClose($file4)

$file5 = FileOpen("libraries/coord.txt", 0)
$coordkom = StringSplit(FileReadLine($file5), ";")
FileClose($file5)

$file6 = FileOpen("libraries/general.txt", 0)
$generalkom = StringSplit(FileReadLine($file6), ";")
FileClose($file6)

$count = Ubound($generalkom)


Dim $ListView5[$count + 1]

$Form1 = GUICreate("Form1", 754, 538, 194, 125)
$Label1 = GUICtrlCreateLabel("Suche", 24, 24, 51, 17)
$Feld = GUICtrlCreateCombo("", 24, 48, 97, 25)
GUICtrlSetData(-1, "Spieler|Stadt|Größe|Allianz|Punkte|Insel|General" )
$operatorcom = GUICtrlCreateCombo("", 128, 48, 98, 25)
GUICtrlSetData(-1, "gleich|größer|kleiner|nicht gleich|")
$wertinput = GUICtrlCreateInput("", 232, 48, 98, 21)
$newsearch = GUICtrlCreateButton("neue Suche", 352, 48, 90, 25, 0)
$search = GUICtrlCreateButton("weiter suchen", 440, 48, 90, 25, 0)
$progressbar2 = GUICtrlCreateProgress(24, 75, 200, 20)
$Label3 = GUICtrlCreateLabel("Ergebnisse", 64, 104, 56, 17)
$ListView1 = GUICtrlCreateListView("Spieler|Stadt|Größe|Allianz |Punkte|Insel|General", 24, 136, 705, 377)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 4, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 5, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 5, 95)



$i = 1;
While $i < $count
$i = $i + 1
$total = $total + 1;
WEnd

$Label2 = GUICtrlCreateLabel($total, 24, 104, 36, 17)

;''''''''''''''''''''''''''''''''''''''''''''''''' '''''''''''''''''''''''''
Dim $ListView5[$total + 2]


$count = UBound($generalkom)

$i = 2;
While $i < $count
$ListView5[$i] = GUICtrlCreateListViewItem($spielerkom[$i] & "|" & $stadtkom[$i] & "|" & $groessekom[$i] & "|" & $allianzkom[$i] & "|" & $punktekom[$i] & "|" & $coordkom[$i] & "|" & $generalkom[$i], $ListView1)
$i = $i + 1

WEnd

GUIRegisterMsg($WM_NOTIFY, "WM_NOTIFY")
GUISetState(@SW_SHOW)

So
06/28/2009 23:38 marcopolo1990#7
warum nicht bis line 1000 lesen next array wieder 1000 lines abarbeiten , next array
sonst attach mal die txt file ,dann fuchtel ich was rum
06/29/2009 00:05 Dung3on#8
Ja das mit den Lines dachte ich auch zuerst, aber das Format des Contents sieht so aus ";blalbal;sdfsdf;sdfsdf;sdfsdf;sdfsdf;sdfs"

Wenn ich das in den Dreamweaver schmeisse und Search Replace mache dann braucht der 2 std. bei einer Datei und ich hab 6 ,die wöchentlich aktualisiert werden^^ (AMD2 6000+)
06/29/2009 00:11 kknb#9
hm ich kann das problem irgendwie nicht nachvollziehen, ich arbeite teils mit sehr großen wordlisten bis 700 mb und habe keine probleme mit dem bearbeiten der files mit autoit.

am besten du hängst so ein file wirklich mal an.


edit: mir ist grad aufgefallen das du wegen deinem stringsplit eh jede zeile einzeln aufrufen musst, dann machs einfach so, dauert aber ewig, da jede zeile wie gesagt eingelesen werden muss. bei mir braucht er aufm lappi ca 10 sek für 1000 zeilen.

Code:
#Include <Array.au3>
#Include <file.au3>

$file = "1.txt"
$anzahl = _FileCountLines($file)
$line =1
for $i = 1 to $anzahl
	$xy=StringSplit(FileReadLine($file, $line), "6",2)
	$line +=1
	FileWriteline("ausgabe.txt",$xy[0])
	$rest = $anzahl - $i
	ToolTip($rest & " lines left")
Next
06/29/2009 01:27 kennyo#10
Sehe ich das richtig, dass du die Daten in riesigen Textdateien speicherst?

Schonmal was von Datenbanken gehört? MySQL z.B.? Das wäre um einiges schneller, und du hast viel mehr Möglichkeiten gezielt Daten herauszufiltern.
06/29/2009 11:33 Dung3on#11
Okay Kknb, das Problem ist jedoch immernoch, dass es Nur eine Line gibt.
Also der Komplette Inhalt ist in einer Zeile.

MySql ist interessant, habe ich noch nie gemacht bei Autoit ist das wie in php? Kann ich Offline Mysql Datenbanken erstellen, ohne ein Extra Programm wie xampp zu nutzen?
06/29/2009 12:50 Adroxxx#12
um eine mysql datenbank zu erstellen, brauchst du mysql... du brauchst nicht unbedingt xampp da dort auch webserver etc drin sind. einfach nur mysql würd reichen, aber dann musste auch server anmachen etc.
06/30/2009 02:06 marcopolo1990#13
hmm, ich weis zwar nicht warum, aber bei mir splittet er die 1. zeile nach ner bestimmten anzahl von zeichen im notepad
die file ist dann 1 kb groß

häng hier wirklich mal deine file an, denn wenns in eine zeile passt, sollte das ein kinderspiel sein oO
06/30/2009 23:30 Dung3on#14
Okay ich habe das Problem ersteinmal gelöst, jedoch ist es recht langsam.
Ich habe in den txt Files jetzt das Format mit Umbrüchen. Also filereadline...

Quote:
$line = 1;
$counter1 = _FileCountLines("libraries/stadt.txt")

$Form1 = GUICreate("Form1", 754, 538, 194, 125)
$Label1 = GUICtrlCreateLabel("Suche", 24, 24, 51, 17)
$Feld = GUICtrlCreateCombo("", 24, 48, 97, 25)
GUICtrlSetData(-1, "Spieler|Stadt|Größe|Allianz|Punkte|Insel|General" )
$operatorcom = GUICtrlCreateCombo("", 128, 48, 98, 25)
GUICtrlSetData(-1, "gleich|größer|kleiner|nicht gleich|")
$wertinput = GUICtrlCreateInput("", 232, 48, 98, 21)
$newsearch = GUICtrlCreateButton("neue Suche", 352, 48, 90, 25, 0)
$search = GUICtrlCreateButton("weiter suchen", 440, 48, 90, 25, 0)
$progressbar2 = GUICtrlCreateProgress(24, 75, 200, 20)
$Label3 = GUICtrlCreateLabel("Ergebnisse", 64, 104, 56, 17)
$Label2 = GUICtrlCreateLabel($counter1, 24, 104, 36, 17)
$ListView1 = GUICtrlCreateListView("Spieler|Stadt|Größe|Allianz |Punkte|Insel|General", 24, 136, 705, 377)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 0, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 1, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 2, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 3, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 4, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 5, 95)
GUICtrlSendMsg(-1, $LVM_SETCOLUMNWIDTH, 5, 95)



$file2 = FileOpen("libraries/spieler.txt", 0)
$file1 = FileOpen("libraries/groesse.txt", 0)
$file3 = FileOpen("libraries/punkte.txt", 0)
$file4 = FileOpen("libraries/allianz.txt", 0)
$file5 = FileOpen("libraries/coord.txt", 0)
$file6 = FileOpen("libraries/general.txt", 0)
$file = FileOpen("libraries/stadt.txt", 0)
GUISetState(@SW_SHOW)
While $line <= $counter1
GUICtrlCreateListViewItem(FileReadLine($file2,$lin e) & "|" & FileReadLine($file,$line) & "|" & FileReadLine($file1,$line) & "|" & FileReadLine($file4,$line) & "|" & FileReadLine($file3,$line) & "|" & FileReadLine($file5,$line) & "|" & FileReadLine($file6,$line), $ListView1)
$line = $line + 1
WEnd

Hat jemand vll. eine Idee wie das schneller gehen könnte? Habe ca. 30.000 Einträge pro File. der braucht bestimmt 10 oder mehr minuten.

Außerdem kann ich "GUICtrlCreateListViewItem()" keiner Variable zuweisen, weil die variablen das nicht packen. Ich möchte jedoch gerne, dass man bestimmte einträge in eine Liste Kopieren kann. Ist das möglich wenn das Listviewitem keinen Namen hat?

Sorry wenn ich so viele Fragen habe, bin nicht so erfahren im Umgang mit so großen Datenmengen.

Bitte um Rat
07/01/2009 02:10 marcopolo1990#15
kannst du wirklich keine test files mal in eine *.rar datei packen und hochladen?
dann wäre dir schneller geholfen als du villeicht gedacht hättest