Jump to content

Sky Slate Blueberry Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate
Photo

Innerhalb einer Datei suchen und Ausgaben erhalten


  • Please log in to reply
15 replies to this topic
Ricks
  • Members
  • 16 posts
  • Last active: May 30 2014 11:52 PM
  • Joined: 08 Nov 2012

Hallo zusammen.

Komme nicht weiter und benötige eure Hilfe:

Ich habe eine Datei, welche für jeden User eine ID, Familiennamen und Vornamen enthalten.
Die ID setzt sich immer aus 2 Buchstaben und 6 Ziffern zusammen. Direkt dahinter folgt ein Gleichheitszeichen und dann der Familienname mit Komma, 1 Leerzeichen und der oder die Vornamen.

Hier ein kurzer Auszug aus der Datei:

       ID        Familienname    Vorname(n)       ID            Familienname       Vorname          ID          Familienname    Vornamen(n)      ID            Familienname    Vorname(n)

ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;

Ich möchte nun aus dieser Datei eine Suche starten. Dazu wird in einer Eingabemaske die ID eingegeben und der Familienname und Vorname(n) sollen zusammen mit der ID ausgegeben werden. Ebenso soll es möglich sein, daß bei Eingabe des Familiennames die ID , Familienname und Vorname(n) ausgegeben werden.

Allerdings kommen manche Familiennamen innerhalb der Datei häufiger vor, es sollen bei der Suche mittels Familienname alle User-Daten ausgegeben werden.

Die Ausgabe kann einfach mittels MsgBox erfolgen.

Ich weiß nicht, wie ich innerhalb dieser Datei die Suche realisieren kann und benötige daher eure Hilfe. Die Datei befindet sich im selben Verzeichnis wie die Script-Datei.

 

Eingesetzt wird AHK-Version 1.0.48.5

Herzliche Grüße, Ricks



 

 



nnnik
  • Members
  • 1625 posts
  • Last active: Jan 24 2019 02:19 PM
  • Joined: 28 Jul 2012

Hi wenn du auf AHK_L also AHK 1.1.9.4 Updaten könntest könnte ich dir helfen.

Bei AHK_Basic muss ich erst umlernen.


Visit the new forum ahkscript.org.

http://ahkscript.org


hd0202
  • Members
  • 709 posts
  • Last active: Feb 14 2016 08:05 PM
  • Joined: 13 Aug 2006

Hier mein Beispiel mit Pseudo-Array:

data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;ab045679=Schmiedeneisers, Friederike;"  ; fuer test statt datei

; fileread, data, %a_scriptdir%\<familien-Namen>  ; datei ersetzen und kommentar-; entfernen

stringsplit, person, data, `;

inputbox, id, id eingeben
if !id
  exitapp
loop, % person0
{
  if (instr(person%a_index%, id "="))
  {
    msgbox, % person%a_index%
    break
  }
  msgbox, % "id " id " nicht vorhanden"
  break
}

inputbox, name, familienname eingeben
if !name
  exitapp
anz = 0
loop, % person0
{
  if (instr(person%a_index%, "=" name ","))
  {
    msgbox, % person%a_index%
    anz++
  }
}
if (anz = 0)
  msgbox, % "name " name " nicht vorhanden"

Hubert



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
Hallo!
Mit AHK_L könnte es so aussehen:
suche.png
 
data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;"

a := {}

Loop, Parse, data, `;
{
	StringSplit, feld, a_loopfield, `,, %A_Space%%A_Tab%
	StringSplit, id_f, feld1, =, %A_Space%%A_Tab%
    a[id_f1,"Name"]  := id_f2
    a[id_f1,"Vorname"]  := feld2
}
gui, add, text, w200 , Suche
gui, add, Edit, w200 vsu gsuch, 
gui, add, ListView, w200 vlv glv +AltSubmit, ID
gui, add, Edit, ved w200 R3, 
gui, Show
gosub, such
return
; ------------------------------------------------------------------------------
such:
gui, Submit, NoHide
LV_Delete()
for, k, in a
  {
  if (InStr(k, su))
    LV_Add("", k)
}
LV_Modify(1, "Select")  ; ersten Eintrag auswählen
return
; ------------------------------------------------------------------------------
lv:
    ff := LV_GetNext(0)
    LV_GetText(lv_text_id, ff, 1)
    GuiControl, , ed, % lv_text_id "`n" a[lv_text_id,"Name"] "`n" a[lv_text_id,"Vorname"]
return
; ------------------------------------------------------------------------------
GuiClose:
ExitApp


MKH
  • Members
  • 26 posts
  • Last active: Aug 06 2013 04:46 AM
  • Joined: 01 May 2013

Bin zwar nicht der Topicersteller, aber kleine bitte @ fredchf

könntest du bitte deinen Code commentieren ? (zu lernzwecken / besserem verständnis)

 

Vielen Dank schon in Voraus

 

mfg

MKH



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
Hallo!
Mache ich doch gerne.
Spoiler


Ricks
  • Members
  • 16 posts
  • Last active: May 30 2014 11:52 PM
  • Joined: 08 Nov 2012

Hallo zusammen.

 

Vielen Dank für eure prompte Hilfe!

 

Der Ansatz von Hubert ist das, was ich im Betrieb gebrauchen kann. (Leider habe ich AHK-L dort nicht zur Verfügung!)

 

Allerdings habe ich ein Problem wenn ich in der Datei suche, daß mir bei der Suche mit der ID keine Daten angezeigt werden.

Es erfolgt immer ID nicht vorhanden. Suche mit der ID funktioniert nur beim ersten Eintrag der Datei.

 

Die Suche mit Familienname funktioniert einwandfrei!!!

 

Ich werde mir wohl zuhause doch endlich mal AHK_L installieren müssen...

 

Gruß, Ricks

 



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
Es geht natürlicch auch ohne Objekt, ist nur nicht so sexy.
data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;"
gui, add, text, w200 , Suche
gui, add, Edit, w200 vsu gsuch, 
gui, add, ListView, w200 vlv glv +AltSubmit, ID|Name|Vorname
gui, add, Edit, ved w200 R3, 
gui, Show
gosub, such
return
; ------------------------------------------------------------------------------
such:
gui, Submit, NoHide
LV_Delete()
Loop, Parse, data, `;
{
	StringSplit, feld, a_loopfield, `,, %A_Space%%A_Tab%
	StringSplit, id_f, feld1, =, %A_Space%%A_Tab%
    if (InStr(id_f1,su))
      LV_Add("", id_f1,id_f2,feld2)
}
LV_Modify(1, "Select")  ; ersten Eintrag auswählen
return
; ------------------------------------------------------------------------------
lv:
    ff := LV_GetNext(0)
    LV_GetText(lv_text_id, ff, 1)
    LV_GetText(lv_text_id2, ff, 2)
    LV_GetText(lv_text_id3, ff, 3)
    GuiControl, , ed, % lv_text_id "`n" lv_text_id2 "`n" lv_text_id3
return
; ------------------------------------------------------------------------------
GuiClose:
ExitApp


hd0202
  • Members
  • 709 posts
  • Last active: Feb 14 2016 08:05 PM
  • Joined: 13 Aug 2006

Sorry, da habe ich nicht genug getestet! So geht es auch mit den anderen IDs:

data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;ab045679=Schmiedeneisers, Friederike;"  ; fuer test statt datei

; fileread, data, %a_scriptdir%\<familien-Namen>  ; datei ersetzen und kommentar-; entfernen

stringsplit, person, data, `;

inputbox, id, id eingeben
if !id
  exitapp
anz = 0
loop, % person0
{
  if (instr(person%a_index%, id "="))
  {
    msgbox, % person%a_index%
    anz++
    break
  }
}
if (anz = 0)
  msgbox, % "id " id " nicht vorhanden"

inputbox, name, familienname eingeben
if !name
  exitapp
anz = 0
loop, % person0
{
  if (instr(person%a_index%, "=" name ","))
  {
    msgbox, % person%a_index%
    anz++
  }
}
if (anz = 0)
  msgbox, % "name " name " nicht vorhanden"

Hubert



Ricks
  • Members
  • 16 posts
  • Last active: May 30 2014 11:52 PM
  • Joined: 08 Nov 2012

Hi,

 

vielen Dank! Ihr habt mir sehr geholfen.Ich bin begeistert... happy.png

Jetzt kann ich alle Abfragen ohne Probleme durchführen.

 

Herzliche Grüße, Ricks



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
Hallo!
Wer höflich fragt und sein Anliegen verständlich erklärt, dem wird auch geholfen. ;)

Ricks
  • Members
  • 16 posts
  • Last active: May 30 2014 11:52 PM
  • Joined: 08 Nov 2012

Hallo, da bin ich schon wieder mit einer Frage.. ;-)

 

@hd0202:

Die Suche läuft in alle Richtungen perfekt! Allerdings wird es bei Namen wie Schmidt, Schmitt, Meier... doch etwas nervig, jedesmal die erscheinende MsgBox wegzuklicken.

 

Die Datenbank, die ich abfrage enthält über 1600 Einträge! Und manche Namen kommen doch recht häufig vor. Ist es möglich doppelte bzw. mehrfach vorhandene Namen in einer einzigen MsgBox anzeigen zu lassen. Dort kann der entsprechende Name ja dann "per Auge" gesucht werden...

 

@fredchf:

Habe mir für daheim AHK_L installiert, da dies wohl die Zukunft ist...

 

Deine Lösung gefällt mir gut. Vor allem, da ich mit Fragmenten der ID (anstatt die komplette ID einzugeben, auch nur mit Teilen der ID) suchen kann und Ergebnisse erhalte. Wie aber kann ich es realisieren, daß auch per Namen gesucht werden kann? Ich meine, daß in der gleichen GUI auch mit Namen gesucht werden kann und entsprechende Ergebnisse präsentiert werden???

 

Gruß, Ricks



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
Hallo Ricks!
Die Scripte von hd0202 und mir sollten nur ein kleiner Anfang sein, da kannst du noch einiges erweitern und ändern.
 
Für deine Erweiterung der Suche sind nur kleine Änderungen nötig. Lösen könnte man die Sache so:
                                                               ;~ daten, ist aber egal woher
data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;"
                                                                ;~ objekt erzeugen
a := {}
                                                                ;~ pars loob durch die daten
Loop, Parse, data, `;
{
	StringSplit, feld, a_loopfield, `,, %A_Space%%A_Tab%        ; teile die daten an jedem simikolon
	StringSplit, id_f, feld1, =, %A_Space%%A_Tab%               ; teile nochmal am Istgleich-Zeichen (=)
    a[id_f1,"Name"]  := id_f2                                   ; schreibe teilergebnis in objekt (z.B. a.ab012345.Name     = Schullenberger)
    a[id_f1,"Vorname"]  := feld2                                ; schreibe teilergebnis in objekt (z.B. a.ab012345.Vorname  = Heinz-Peter)
}
gui, add, text, w200 , Suche                                    ; nur Text
gui, add, Edit, w200 vsu gsuch,                                 ; Editfeld für die Suche, Inhalt wird in der var 'su' gespeichert
gui, add, ListView, w200 vlv glv +AltSubmit, ID|Name            ; ListView , jedes klicken ruft Unterfunktion(lv) auf
gui, add, Edit, ved w200 R3,                                    ; noch ein Editfeld für Ausgabe
gui, Show
gosub, such                                                     ; Unterfunktion aufrufen
return
; -------------------Unterfunktion ListView füllen-----------------------------------------------------------
such:
gui, Submit, NoHide                                             ; Variablen abrufen
LV_Delete()                                                     ; alten Inhalt leeren
GuiControl, -Redraw,  lv                                        ; bei größeren Datenmengen zu empfehlen
for, k, in a                                                    ; eine Schleife für jeden Schlüssel im Objekt 'a'
  {
  if (InStr(k, su) or InStr(a[k,"Name"], su))                   ; wenn in k(z.B. 'ab012345') der String aus dem Editfeld ('su') gefunden wird
    LV_Add("", k,a[k,"Name"])                                   ; in ListView eintragen
}
GuiControl, +Redraw,  lv
LV_Modify(1, "Select")                                          ; ersten Eintrag auswählen
return
; ------------------Unterfunktion Text in Editfeld ausgeben------------------------------------------------------------
lv:
    ff := LV_GetNext(0)                                         ; selektierte Zeile in var 'ff' speichern, eigentlich nicht nötig
    LV_GetText(lv_text_id, ff, 1)                               ; Text des selektierten Eintrages in ListView ermitteln
    GuiControl, , ed, % lv_text_id                              ; Editfeld mit neuen Daten füllen, ab012345
                    . "`n" a[lv_text_id,"Name"]                 ; Schullenberger
                    . "`n" a[lv_text_id,"Vorname"]              ; Heinz-Peter
return
; ------------------------------------------------------------------------------
GuiClose:                                                       ; wenn Gui geschlossen wird
ExitApp
Die Namen können im Listview angezeigt werden(s.Script), müssen für die Suche aber nicht.

BTW:
Wie weiter oben schon geschrieben, ist ahk_L nicht unbedingt nötig, um so etwas umzusetzen.

EDIT:
bei großen Datenmengen sollte die Option Redraw benutzt werden

Ricks
  • Members
  • 16 posts
  • Last active: May 30 2014 11:52 PM
  • Joined: 08 Nov 2012

Hallo fredchf.

 

Jau, das ist es! Ich habe allerdings Schwierigkeiten mit dem ListView... Das ist überhaupt nicht meine Stärke und ich werde das wohl nie kapieren. Habe schon desöfteren versucht mich damit auseinanderzusetzen - ich bin dazu aber wohl zu einfältig :-(

 

Habe folgende Zeile so ergänzt, daß ich auch mit Vornamen suchen kann - das habe ich also schon mal hinbekommen ;-)

if (InStr(k, su) or InStr(a[k,"Name"], su) or InStr(a[k,"Vorname"], su)) ; wenn in k(z.B. 'ab012345') der String aus dem Editfeld ('su') gefunden wird

Und ich kann es kaum glauben, es funktioniert!!!

 

Wie kann ich nun im ListView auch noch die Vornamen anzeigen lassen? Das macht das ganze etwas übersichtlicher, wenn ich mit Familienname suche und es eine Menge gleicher Familiennamen gibt...

 

Vielen Dank für die Hilfe und Gruß, Ricks



fredchf
  • Members
  • 111 posts
  • Last active: Oct 23 2019 07:56 PM
  • Joined: 02 Nov 2012
                                                               ;~ daten, ist aber egal woher
data := "ab012345=Schullenberger, Heinz-Peter;ab023456=Schmidt-Trompetter, Dominique;ab034567=Schmittenpauker, Hans Joseph;ab045678=Schmiedeneisers, Frederick;"
                                                                ;~ objekt erzeugen
a := {}
                                                                ;~ pars loob durch die daten
Loop, Parse, data, `;
{
	StringSplit, feld, a_loopfield, `,, %A_Space%%A_Tab%        ; teile die daten an jedem simikolon
	StringSplit, id_f, feld1, =, %A_Space%%A_Tab%               ; teile nochmal am Istgleich-Zeichen (=)
    a[id_f1,"Name"]  := id_f2                                   ; schreibe teilergebnis in objekt (z.B. a.ab012345.Name     = Schullenberger)
    a[id_f1,"Vorname"]  := feld2                                ; schreibe teilergebnis in objekt (z.B. a.ab012345.Vorname  = Heinz-Peter)
}
gui, add, text, w400 , Suche                                    ; nur Text
gui, add, Edit, w400 vsu gsuch,                                 ; Editfeld für die Suche, Inhalt wird in der var 'su' gespeichert
gui, add, ListView, w400 vlv glv +AltSubmit, ID|Name|Vorname    ; ListView , jedes klicken ruft Unterfunktion(lv) auf
gui, add, Edit, ved w400 R3,                                    ; noch ein Editfeld für Ausgabe
gui, Show
gosub, such                                                     ; Unterfunktion aufrufen
return
; -------------------Unterfunktion ListView füllen-----------------------------------------------------------
such:
gui, Submit, NoHide                                             ; Variablen abrufen
LV_Delete()                                                     ; alten Inhalt leeren
GuiControl, -Redraw,  lv                                        ; bei größeren Datenmengen zu empfehlen
for, k, in a                                                    ; eine Schleife für jeden Schlüssel im Objekt 'a'
  {
  if (InStr(k, su) or InStr(a[k,"Name"], su) or InStr(a[k,"Vorname"], su))   ; wenn in k(z.B. 'ab012345') der String aus dem Editfeld ('su') gefunden wird
    LV_Add("", k,a[k,"Name"],a[k,"Vorname"])                    ; in ListView eintragen
}
GuiControl, +Redraw,  lv
LV_Modify(1, "Select")                                          ; ersten Eintrag auswählen
LV_ModifyCol(2,"AutoHdr")                                       ; Breite anpassen
LV_ModifyCol(1,"AutoHdr")                                       ; 
return
; ------------------Unterfunktion Text in Editfeld ausgeben------------------------------------------------------------
lv:
    ff := LV_GetNext(0)                                         ; selektierte Zeile in var 'ff' speichern, eigentlich nicht nötig
    LV_GetText(lv_text_id, ff, 1)                               ; Text des selektierten Eintrages in ListView ermitteln
    GuiControl, , ed, % lv_text_id                              ; Editfeld mit neuen Daten füllen, ab012345
                    . "`n" a[lv_text_id,"Name"]                 ; Schullenberger
                    . "`n" a[lv_text_id,"Vorname"]              ; Heinz-Peter
return
; ------------------------------------------------------------------------------
GuiClose:                                                       ; wenn Gui geschlossen wird
ExitApp