Daten aus CSV abfragen, weiterverarbeiten und abspeichern

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 05:54

So da bin ich wieder :)

Ein paar Tage später, da ich viel zu arbeiten hatte, aber immerhin konnte ich mich nun mit dem Projekt weiter befassen....

Code: Select all

^9::

MeinSemikolon := chr(59)
MeinLineFeed := chr(13)

i := 0

Run, "C:\Program Files (x86)\XXXXX.exe", , ,PID	; starten XXXXX und PID merken
;MsgBox, %PID%
sleep, 30000


Loop, Read, c:\tmp\2017-11-15\2017-11-15.csv
{
i := i+1
If (40 = i)     ; nach 50 datensätzen XXXX neustarten
{

;MsgBox, Dreidatenaeze

Process, Close, %PID%
sleep, 8000

Run, "C:\Program Files (x86)\XXXXX", , ,PID ;Programm starten und PID merken um zwischendurch neuzustarten
sleep, 30000
i := 0
}



Vorwahl := SubStr(A_LoopReadLine, 1, 3)
rufnr   := SubStr(A_LoopReadLine, 4, 7)



;MsgBox, %Vorwahl%
;MsgBox, %rufnr%


WinActivate, ahk_class Mein Programm
;WinActivate, ahk_class Notepad

MouseClick, left, 43, 195 ;Suchanfrage auswählen
sleep, 500
MouseClick, left, 217, 93
sleep, 500


Send %A_Tab% ;Auf Rufnummer wechseln
sleep, 100
send %rufnr%
sleep, 100
send %A_Tab% ;Auf Kennwort wechseln
sleep, 100
send %kkw%
sleep, 100
send, {enter}
sleep, 20000
send, {Esc}
sleep, 1000
send, {Esc}
sleep, 1000

FileAppend, %A_LoopReadLine% %MeinSemikolon% %KName% %MeinSemikolon% %KTarif% %MeinLineFeed%, c:\tmp\2017-11-15\XXXXX.csv
}

else if pruefnr <> %rufnr%  ; Kein Datensatz gefunden
{
FileAppend, %A_LoopReadLine% %MeinLineFeed%, c:\tmp\2017-11-15\XXXX-fehler.csv
sleep, 1000
}
}

Exit
return


So, das ist der etwas gekürzte Code...... Aber alles, was in der Mitte steht, ist hier eher irrelevant....
Meine Frage nun: Wenn Datensätze abgearbeitet wurden, müssten diese im Optimalfall aus der Startdatei verschwinden.... ich habe dazu aber noch nichts gefunden... Ich bin nun dazu übergegangen, nach Vorwahl und Rufnummer des Kunden zu suchen, da ich nicht weiß, wie ich sonst anders die einzelnen Felder als Variable auslesen kann... Gibt es einen Trick, wie ich definieren kann, dass das Semikolon die Datenfelder von einander trennt?

Wieder einmal: Vielen Dank im Voraus :)
Last edited by Benjo85 on 16 Nov 2017, 12:17, edited 1 time in total.
BoBo
Posts: 2519
Joined: 13 May 2014, 17:15

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 06:52

Meine Frage nun: Wenn Datensätze abgearbeitet wurden, müssten diese im Optimalfall aus der Startdatei verschwinden.... ich habe dazu aber noch nichts gefunden... Ich bin nun dazu übergegangen, nach Vorwahl und Rufnummer des Kunden zu suchen, da ich nicht weiß, wie ich sonst anders die einzelnen Felder als Variable auslesen kann... Gibt es einen Trick, wie ich definieren kann, dass das Semikolon die Datenfelder von einander trennt?
a) Dateiänderung bedeutet schlicht, diese neu zu erstellen :arrow: FileMove
b) einzelne datensätze lassen sich super mittels array verwursten :arrow: StrSplit()
c) Loop, Parse wäre das bevorzugte mittel um CSV dateien auszuwerten
Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 09:45

Noch eine spannende Frag.....

kann ich für die Loop, Read eine MsgBox schreiben, in der ich die CSV-Dateien auswählen kann? Eigentlich müsste doch nur ein Feld auszufüllen sein, in dem ich eine Variable einspeichern kann...
Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 10:01

Okay..... FileSelectFile, OutputVar :D
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 10:56

Mal zurück zu Deinem Code:
  • Du startest Deine Anwendung.

    Code: Select all

    Run, "C:\Program Files (x86)\XXXXX.exe", , ,PID	; starten EPOS und PID merken
  • Dann folgt ein Loop, Read über die CSV-Datei.

    Code: Select all

    Loop, Read, c:\tmp\2017-11-15\2017-11-15.csv
  • Alle 40 (50) Sätze wird die Anwendung beendet und neu gestartet. Wozu ist das gut?

    Code: Select all

    	If (40 = i)     ; nach 50 datensätzen EPOS neustarten
    	{
    		;MsgBox, Dreidatenaeze
    		Process, Close, %PID%
    		sleep, 8000
    		Run, "C:\Program Files (x86)\XXXXX", , ,PID ;Programm starten und PID merken um zwischendurch neuzustarten
    		sleep, 30000
    		i := 0
    	}
  • Dann nimmst Du Dir die erten beiden Felder aus dem eingelesenen Satz, füllst damit das Suchfenster und startest die Suche.

    Code: Select all

    	Vorwahl := SubStr(A_LoopReadLine, 1, 3)
    	rufnr   := SubStr(A_LoopReadLine, 4, 7)
    	;MsgBox, %Vorwahl%
    	;MsgBox, %rufnr%
    	WinActivate, ahk_class Mein Programm
    	;WinActivate, ahk_class Notepad
    	MouseClick, left, 43, 195 ;Suchanfrage auswählen
    	sleep, 500
    	MouseClick, left, 217, 93
    	sleep, 500
    	Send %A_Tab% ;Auf Rufnummer wechseln
    	sleep, 100
    	send %rufnr%
    	sleep, 100
    	send %A_Tab% ;Auf Kennwort wechseln
    	sleep, 100
    	send %kkw%
    	sleep, 100
    	send, {enter}
    	sleep, 20000
    	send, {Esc}
    	sleep, 1000
    	send, {Esc}
    	sleep, 1000
Soweit, so (vielleicht) gut. Ich kann allerdings nichts finden, das das Suchergebnis aus dem Suchfenster ausliest. Was soll dann

Code: Select all

FileAppend, %A_LoopReadLine% %MeinSemikolon% %KName% %MeinSemikolon% %KTarif% %MeinLineFeed%, c:\tmp\2017-11-15\XXXXX.csv
updaten? Außerdem bleibt die Frage offen, woran Du erkennst, dass die Suche mit/ohne Erfolg abgeschlossen wurde.
Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 12:14

Ich habe den Code ein wenig gekürzt, da ich doch viel mehr Felder auslese, als es mal angedacht war.... Ich selektiere diverse Felder, kopiere den Inhalt und ziehe aus der Zwischenablage den Inhalt raus und definiere diese dann als Variable und gebe sie zum schluss in die CSV Datei unten aus....
so weit funktioniert alles...

Nun muss ich das nur noch auf die Ketten bekommen, dass ich die Vorwahl und Rufnummer nicht nur nach einer einheitlichen Länge in einzelne Variablen bekomme.... Leider sind ja nicht alle Vorwahlen gleich lang....

Bobo hat dazu ja schon einen Tipp abgegeben... den Muss ich nun nur noch umgesetzt bekommen :)

Ob die Suche erfolgreich war, sehe ich nach her in der ausgegebenen CSV Datei daran, dass Fehlerhafte Daten nicht gefüllt werden..... Bisher habe ich nur eine Prüfung drinnen:

Code: Select all

MouseClick, left, 206, 135 ;Rufnummer auswählen zur Pruefung
Click, 2
sleep, 100
MouseClick, right, 206, 135
MouseClick, left, 218, 144
sleep, 100
pruefnr := Clipboard

If pruefnr = %rufnr%
{
Ich wollte an dieser Stelle nicht mit send ^a, send ^c arbeiten, da es zu Fehlfunktionen kommt, wenn ich ^a drücke, ohne das ein Datensatz geöffnet ist.... Daher muss ich an dieser Stelle mit der Maus arbeiten, auch wenn dies nicht so optimal ist

Nur wenn dieses Merkmal übereinstimmt, geht es im Script weiter.... Ansonsten wird der Datensatz in eine seperate CSV eingespeichert....

Vielleicht kann ja mal einer von euch Profis dem kleinen Anfänger ein wenig Code formulieren, wie ich Bobos Tipp in meinem Fall anwenden könnte....

VG Benjo



EDIT:
Das Programm baut anscheinend einen riesen Cach auf oder was auch immer und wird nach einigen Abfragen zu langsam und wird daher zwischendurch einfach neugestartet um wieder die sichere Performace zu erzielen
Last edited by Benjo85 on 16 Nov 2017, 12:23, edited 1 time in total.
BoBo
Posts: 2519
Joined: 13 May 2014, 17:15

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 12:17

Wenn du hier supporter mit ins boot holen willst brauchts schon mal die "quell.csv" als proviant ;)
Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 12:21

Oh recht hast du.... ich dachte, dass der erste Post und der Code schon alles verrät :)

Aber da isse :)
bsp.csv
(26 Bytes) Downloaded 46 times
User avatar
divanebaba
Posts: 779
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Hallo erst Einmal und schon die erste Frage....

16 Nov 2017, 12:21

Benjo85 wrote:... Es handelt sich um 2 Felder einer CSV-Datei, die ich in zwei Suchfelder eingebe und dann die Suche auslöse durch drücken eines Buttons. ...
Benjo85 wrote:... Die CSV sieht so aus:
Name;Kundennummer;Nächster Termin;Produkt-Alt;Produkt-Neu
Schmidt;123456;;;
Haase;954123;;; ...
Benjo85 wrote:... Ich bin nun dazu übergegangen, nach Vorwahl und Rufnummer des Kunden zu suchen ...
Der Aufgabenstellung zu folgen wird immer schwieriger.
Wenn die CSV-Datei Kundenname und Kundennummer beinhaltet und beide Angaben für eine Suche verwendet werden, könnte man annehmen, daß das Ergebnis der Suche der neue Termin, das alte und das neue Produkt sind.
Jetzt heißt es aber, daß nun auch nach Vorwahl und Telefonnummer gesucht wird. Vielleicht solltest Du mal diese CSV-Datei erklären, was es damit auf sich hat. Auch Deine Aussage: "Wenn Datensätze abgearbeitet wurden, müssten diese im Optimalfall aus der Startdatei verschwinden" bedarf, nach meinem Verständnis, einer Erläuterung.

Normalerweise ist eine Kundennummer eindeutig (für Mathematiker vielleicht sogar eineindeutig). Darum finde ich es seltsam, daß sowohl der Name, als auch die Kundennummer in das nicht näher beschriebene "Suchprogramm" eingegeben werden. Die Ausgabe des Suchprogramms ist vermutlich "der neue Termin, das alte und das neue Produkt". Ich schreibe "vermutlich", weil dies nicht angegeben ist, in der CSV-Datei aber als Spalten vorliegen und diesen Eindruck erwecken.

Kann es sein, daß ein Programm, aufgrund gewisser Parameter, die erstmals genannte CSV-Datei generiert. Zum Bsp. ein Patient war drei Monate nicht in der Praxis, oder ein Kunde hat seit einem Jahr kein Ersatzteil gekauft. Das erste Programm hat (vermutlich) nur die Kundennummer parat. Eine Zusammenarbeit mit einem zweiten Programm, vermutlich eine Adressdatenbank, ist zur Zeit noch nicht realisiert, weswegen die CSV-Datei manuell ausgelesen und (schon wieder) "vermutlich" ergänzt wird. Oder doch nicht ergänzt, sondern direkt in eine in neue Datei?

Ich für meinen Teil, bin ich nur am Vermuten und das macht keinen Sinn, geschweige denn Spaß.

Eine klare Präzisierung der Aufgabenstellung ist hier gefragt, meine ich.

Oder, wir machen es wie die deutsche Polizei. Die Schuld liegt vermutlich beim Türken. :trollface: :trollface:
Benjo85
Posts: 18
Joined: 10 Nov 2017, 14:30

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 12:29

Eine klare Präzisierung der Aufgabenstellung ist hier gefragt, meine ich.
Ja, ich habe die Aufgabenstellung vom Start bis jetzt ein wenig verändert... Ich dachte jedoch, dass es hier auch gern mal um kleinere Fragen gehen darf und Projekte nicht unbedingt in vollständigem Umfang offen gelegt werden müssen....
Ich schätze mal, dass hier so gut wie niemand alle Projekte in vollem Umfang offenlegt... Wir Programmieren doch nicht das Projekt zusammen, sondern ich muss das Ding für mich hinbekommen....
Dennoch freue ich mich zwischendurch über Lösungsansätze und über die Hilfestellung zu einzelnen Fragmenten meines kleinen Skriptes....
User avatar
divanebaba
Posts: 779
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

16 Nov 2017, 17:17

Niemand hat eine Offenlegung Deines Projektes verlangt, und am wenigstens ich. Bestimmt kannste hier kleinere Fragen stellen, meinetwegen auch größere.
Deiner Phantasie sollten oder könnten, bis auf die Administratoren, keine Grenzen gesetzt sein.

"Daten aus CSV abfragen, weiterverarbeiten und abspeichern", so lautet der Thread.
"Hallo erst Einmal und schon die erste Frage....", hieß er ürsprünglich.
"CSV-Datei auslesen und neuschreiben", war meine Vorstellung.

Bevor er umgenannt wird in "Zweitausendundsiebzehn Fragen und eine Empfehlung zuviel", zeige ich schnell, nach meinen deutlichen Hinweisen von zuvor, wie ich eine csv-Datei auslesen, und neuschreiben würde.
divanebaba wrote: - CSV-Datei mit Fileread einlesen,
- mit Loop parse zeilenweise in A_LoopField einlesen
- A_LoopField mit Stringsplit oder einem weiteren Loop parse splitten
jetzt wird es kniffelig, siehe Ingenieurregel Nummer eins, da noch Informationen fehlen:
...
Somit sollte Deine erste Frage, wenigstens zum Teil, beantwortet sein.
Ob Du jetzt, unter dem Codeabschnitt "Verarbeiten", Käse oder Wurst machst, ist und soll Dein Bier, Projekt, oder was auch immer, bleiben.

Code: Select all

Fileread, csvContent, c:\tmp\2017-11-15\2017-11-15.csv
neuCSV = 
Loop, Parse, csvContent, `n, `r
	{
		StringSplit, c_, A_LoopField, `;
		; "Daten aus CSV abfragen" erledigt.
		; "weiterverarbeiten" noch nicht erledigt 
		; ... Hier kannst dich austoben
		; "abspeichern" - erledigt
		neuCSV = %neuCSV%`n%%c_1%`;%c_2%`;%c_3%`;%c_4%`;%c_5%
		; StringTrim ... ; den genauen Code für `n am Anfang wegtrimmen habe ich vergessen
		; kannst ja in die nächste Frage einbauen, wenn Du es benötigen solltest - Schönen Gruß noch :HeHe: 
	}
FileAppend, %neuCSV%, c:\tmp\2017-11-15\XXXXX.csv
Ganz nebenbei ist diese Codierung nicht so hardwarelastig. Performanceprobleme sollten Geschichte sein.
Loop Read zum Auslesen und FileAppend innerhalb der Schleife ausführen, muss nun wirklich nicht sein. Oder sieht das jemand anders?
just me
Posts: 6486
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Daten aus CSV abfragen, weiterverarbeiten und abspeichern

17 Nov 2017, 03:31

Moin,

wenn wir Alles ausblenden, was mit der Steuerung Deiner 'Firmenanwendung' zu tun hat, sollte Dir divanebaba alle Informationen geliefert haben, die Du brauchst, ohne 'Dein Projekt offenlegen' zu müssen.

Nach näherer Betrachtung überkommt mich aber eine Ahnung, zumal Du Deinen Feldern immer wieder mal neue Bezeichnungen gibst:
  • Nach Deinen Angaben hat Deine 'Anwendung' zwei Eingabefelder.
  • Code: Select all

    	Send %A_Tab% ;Auf Rufnummer wechseln
    	sleep, 100
    	send %rufnr%
    	sleep, 100
    	send %A_Tab% ;Auf Kennwort wechseln
    	sleep, 100
    	send %kkw%
  • Die hier als rufnr bezeichnete Variable enthält die Daten des Feldes, das Du ursprünglich mal als 'Name' bezeichnet hast.
    Die hier als kkw bezeichnete Variable enthält die Daten des Feldes, das Du ursprünglich mal als 'Kundennumer' bezeichnet hast.
Ein Schelm, wer Böses dabei denkt.
User avatar
divanebaba
Posts: 779
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: Hallo erst Einmal und schon die erste Frage....

19 Nov 2017, 11:10

Fehlt nur noch das Wahrnehmen dieses Hinweises:
just me wrote:... Zur Fernsteuerung des Suchprogramms wären ein paar ergänzende Informationen hilfreich. Bei installiertem AHK findest Du im Startmenü unter AutoHotkey je nach Version ein Programm "Active Window Info (Window Spy)" oder "AU3 Window Spy". Wenn Du das startest und dann das Fenster des Suchprogramms aktivierst, zeigt es Dir die Informationen über das Fenster und die Steuerelemente unterhalb des Mauscursors an, die AHK erkennen kann. Mit diesen Informationen ist es eventuell möglich, die Steuerelemente des Suchprogramms direkt anzusteuern, d.h. ohne Klicks und Tabs. ...
Kein stabiler Scriptablauf, ohne diese Informationen.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 16 guests