Brauche Hilfe bei ListView füllen mit 3 Dateien

01/14/2019 10:41 Lindanus#1
Hallo,
ich brauche mal Hilfe bei meinem kleinen Programm.
Ich möchte gerne aus 3 Dateien verschiedene Einträge einlesen, die im Zusammenhang stehen und dann in einem ListView ausgeben.
Danach möchte es gerne exportieren.

Ich habe mal alles was ich habe in den Anhang gelegt.

Wenn mir einer dabei helfen könnte, dann würde ich mich riesig freuen.
Vielen dank !
01/14/2019 13:51 florian0#2
Naja ... ne konkrete Frage wäre schon gut ...

Die Potato-Variante wäre stumpf bei Link.txt anzufangen. Geh jede Zeile durch und suche für jede Zeile die Platzhalter-Texte. Dazu schreibst du ne Funktion die einfach die Texte-Datei öffnet, nach dem Token sucht, den Text dazu rausholt, und wieder schließt. Mit der ID machst dus genauso. Sobald du einen Eintrag fertig hast, schreibst du ihn in das ListView.

Wie gesagt: Potato ... schnell ist das sicher nicht. Jenachdem wie viele hundert oder tausend Einträge du hast kann das schonmal ein paar Minuten dauern.
05/16/2019 15:03 lolkop#3
Würde bei kleineren Dateien immer dazu raten, diese einmalig einzulesen und anschließend aus dem Speicher heraus zu nutzen.

Die Arbeit direkt im Arbeitsspeicher beschleunigt die Aktionen mindestens um das 1000-Fache.

Hier ein Beispiel, wie man vorgehen könnte:
Code:
Global $data[1][5] = [[0]] ;[ListViewItem,ID,Objekt,Objekttitel,Objektbeschreibung]

GUICreate('GUI', 400, 240, Default, Default, 0x10C80000)
$guiListView = GUICtrlCreateListView('ID|Objekt|Objekttitel|Objektbeschreibung', 10,10,380,200)
$guiExportShort = GUICtrlCreateButton('Export Short', 10, 210, 190, 20)
$guiExportLong = GUICtrlCreateButton('Export Long', 200, 210, 190, 20)

Global $textDict = CreateTextDictionary(@ScriptDir & '\datei3 Text.txt')
Global $idDict = CreateIdDictionary(@ScriptDir & '\datei1 ID.txt')
FillListView(@ScriptDir & '\datei2 Link.txt')

While True
	Switch GUIGetMsg()
		Case -3
			Exit
		Case $guiExportShort
			$exportData = ''
			For $i=1 To $data[0][0]
				$exportData &= $data[$i][1]
				$exportData &= '|'
				$exportData &= $data[$i][3]
				$exportData &= @CRLF
			Next
			FileDelete(@ScriptDir & '\exportShort.txt')
			FileWrite(@ScriptDir & '\exportShort.txt', $exportData)
		Case $guiExportLong
			$exportData = ''
			For $i=1 To $data[0][0]
				$exportData &= $data[$i][1]
				$exportData &= '|'
				$exportData &= $data[$i][3]
				$exportData &= '|'
				$exportData &= $data[$i][4]
				$exportData &= @CRLF
			Next
			FileDelete(@ScriptDir & '\exportLong.txt')
			FileWrite(@ScriptDir & '\exportLong.txt', $exportData)
	EndSwitch
WEnd

Func AddToData($id,$object,$objectTitle,$objectDesc)
	$data[0][0]+=1
	ReDim $data[$data[0][0]+1][5]
	$data[$data[0][0]][0] = GUICtrlCreateListViewItem($id&'|'&$object&'|'&$objectTitle&'|'&$objectDesc,$guiListView)
	$data[$data[0][0]][1] = $id
	$data[$data[0][0]][2] = $object
	$data[$data[0][0]][3] = $objectTitle
	$data[$data[0][0]][4] = $objectDesc
EndFunc

Func CreateTextDictionary($file)
	Local $fileContent = FileRead($file)
	Local $dict = ObjCreate("Scripting.Dictionary")
	local $filtered = StringRegExp($fileContent, '(TEXT_[^	]+)	(.+)',3)
	For $i=0 To UBound($filtered)-1 Step 2
		$dict.Add($filtered[$i],$filtered[$i+1])
	Next
	Return $dict
EndFunc

Func CreateIdDictionary($file)
	Local $fileContent = FileRead($file)
	Local $dict = ObjCreate("Scripting.Dictionary")
	local $filtered = StringRegExp($fileContent, '\n#define ([^	]+)	(\d+)',3)
	For $i=0 To UBound($filtered)-1 Step 2
		$dict.Add($filtered[$i],$filtered[$i+1])
	Next
	Return $dict
EndFunc

Func FillListView($file)
	Local $fileContent = FileRead($file)
	Local $regEx = StringRegExp($fileContent,'\n([^	]+)	(TEXT_[^	]+)	(TEXT_[^	]+)', 3)
	For $i=0 To UBound($regEx)-1 Step 3
		AddToData($idDict.Item($regEx[$i]),$regEx[$i],$textDict.Item($regEx[$i+1]),$textDict.Item($regEx[$i+2]))
	Next
EndFunc