2-dimensionales Array auswerten Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

2-dimensionales Array auswerten

Post by effel » 23 Jul 2020, 18:49

hallo,
ich beschäftige mich mit den Daten der blauen Bahnhofstafel, die Auswertung der Daten habe ich mit arrays gehändelt. das funktioniert alles ganz gut.

Ich beziehe die Daten von:
https://iris.noncd.db.de/wbt/js/index.html?bhf=KK&Zeilen=50" ; abfahrt köln hbf
https://iris.noncd.db.de/wbt/js/index.html?typ=an&style=an&bhf=KK&Zeilen=50" ; ankunft köln hbf


Jede `Tour`bekommt eine eigene TripID Beispiel: 0-3441732994589337025-2007240459-1.
Die 1 am Ende zeigt den Startbahnhof an und zählt bei jedem folgenden Bahnhof aufwärts.

Diese TripID finde ich auf jeder Bahnhofsanzeige wo der Zug hält und kann, wenn ich auch diese Seite parse, mein Ergebnis mit den dortigen Abfahrtzeiten erweitern. Man könnte Live verfolgen, in welchem Bahnhof der Zug grade ist.


So einen Datensatz bekomme ich jeweils für Ankunft und Abfahrt.

In dem `Ankunft` sind die Bahnhöfe aufgeführt, die der Zug seit Tourbeginn bedient hat. In dem `Abfahrt` sind die Bahnhöfe bis zum Ziel aufgeführt.

Code: Select all

0-3441732994589337025-2007240459-1
04:59
IC 2314
Westerland(Sylt)

Düsseldorf Hbf,Duisburg Hbf,Essen Hbf,Gelsenkirchen Hbf,Dülmen,Osnabrück Hbf,Bremen Hbf,Hamburg-Harburg,Hamburg Hbf,Hamburg Dammtor,Itzehoe,Heide(Holst),Husum,Niebüll
Düsseldorf Hbf,Duisburg Hbf,Essen Hbf,Gelsenkirchen Hbf,Dülmen,Osnabrück Hbf,Bremen Hbf,Hamburg-Harburg,Hamburg Hbf,Hamburg Dammtor,Itzehoe,Heide(Holst),Husum,Niebüll
Hält auch in Dülmen.
Hält nicht in Münster(Westf)Hbf.
5
Nun mein Problem:

In dieser Liste https://ds100.frankfurtium.de/dumps/ds100.html finde ich alle Bahnhöfe mit dazugehörendem Code. Aus "Köln HBF" wird KK
<tr>
<th id="KK">KK</th>
<td>Köln Hbf</td>
</tr>

Weiteres Beispiel:
<tr>
<th id="AHI">AHI</th>
<td>Heide (Holst)</td>
</tr>


Wenn ich bisher mit Array arbeite, werden sie meist geloopt. gibt es auch eine Möglichkeit das Array auszuwerten, ohne tausende Zeilen durch zu loopen?

Ich habe Heide (Holst) und das Abfrageergebnis soll AHI sein.

Dann noch eine Frage, kann ich ein normales Array umsortieren? ich meine damit der erste wird zu letzten, nicht a-z sortiert.

BoBo
Posts: 3645
Joined: 13 May 2014, 17:15

Re: 2-dimensionales Array auswerten

Post by BoBo » 24 Jul 2020, 01:17

Dann noch eine Frage, kann ich ein normales Array umsortieren? ich meine damit der erste wird zu letzten, nicht a-z sortiert.
Die Frage (oder so ähnlich) hatten wir vor kurzem auch im berüchtigten "Ahnungslosigkeit ..."-thread. Die default Ausgabe der keys erfolgt wohl grundsätzlich alphabetisch sortiert, unabhängig davon ob das associative array in zufälliger Reihenfolge angelegt wurde. Würde demnach noch (mindestens) einen Extraschritt z.B. über Sort (reverse) erfordern.
Wenn ich bisher mit Array arbeite, werden sie meist geloopt. gibt es auch eine Möglichkeit das Array auszuwerten, ohne tausende Zeilen durch zu loopen?
Logisch lässt sich das array auch gezielt abfragen. Beim standard array über die Position des items ("array[3]" oder "array.3") bzw beim associative array über den Schlüssel ("array.key[2]" oder "array.key.2")

Code: Select all

arr := {"key":["x","y","z"]}
MsgBox % var := arr.key.2    ; abfrage der 2. position des item mit dem schlüssel 'key'  = "y"
... oder schon direkt bei der 'Bestückung' eines (unbenannten?) arrays/matchlist mittels StrSplit()

Code: Select all

string := "a,b,c,d,e"
MsgBox % StrSplit(string,",").3   ; liefert "c" = das 3. item
Das decoding des html-konstrukts würde ich entweder über RegEx (bevorzugt) oder über COM + innertext (?) machen.

PS. Das ist übrigens der erste thread bei dem ich nahezu konstant nur "Bahnhof" verstehe :mrgreen:

just me
Posts: 7233
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: 2-dimensionales Array auswerten

Post by just me » 24 Jul 2020, 04:19

Moin,

ich verstehe bisher nicht, was der Titel mit Deinem Problem zu tun hat.

Alle AHK-Arrays sind assoziativ, d.h., sie verbinden einen Schlüsselbegriff mit einem Wert. Für AHK ist es egal, ob der Schlüsselbegriff numerisch (mit oder ohne Lücken) oder eine Zeichenkette ist. Bei Zeichenketten muss man allerdings im Hinterkopf behalten, dass AHK 1.1 Großkleinschreibung nicht beachtet.

Wenn Du die HTML-Datei auswertest, kannst Du ein Array aufbauen, das den 'Klarnamen' Köln Hbf als Schlüssel und die Abkürzung/ID KKals Wert enthält. Den Wert kannst Du dann mit

Code: Select all

BahnhofsName := "Köln Hbf"
BahnhofsID := BahnhofsArray[BahnhofsName]
direkt auslesen.

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

Re: 2-dimensionales Array auswerten

Post by effel » 24 Jul 2020, 04:38

das habe ich gesucht.
just me wrote:
24 Jul 2020, 04:19

Code: Select all

BahnhofsName := "Köln Hbf"
BahnhofsID := BahnhofsArray[BahnhofsName]
direkt auslesen.
danke just me.

passt das nicht zum Titel? auswerten... auslesen... war doch knapp dran ;)

just me
Posts: 7233
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: 2-dimensionales Array auswerten

Post by just me » 24 Jul 2020, 04:50

Na ja, das BahnhofsArray ist eindimensional. ;)

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

Re: 2-dimensionales Array auswerten

Post by effel » 24 Jul 2020, 04:52

Geht doch nicht. Ich dachte es so verstanden zu haben.

Code: Select all

BahnhofsArray := []
BahnhofsArray.push("kk","Köln Hbf")
BahnhofsName := "Köln Hbf"
BahnhofsID := BahnhofsArray[BahnhofsName]
MsgBox % BahnhofsID

BoBo
Posts: 3645
Joined: 13 May 2014, 17:15

Re: 2-dimensionales Array auswerten  Topic is solved

Post by BoBo » 24 Jul 2020, 05:00

Code: Select all

BahnhofsArray := {}   ; 'leeres' associative array
BahnhofsArray["Köln Hbf"] := "kk"    ; legt ein item als 'schlüssel-wert'-paar an

BahnhofsID := BahnhofsArray["Köln Hbf"]   ; abfrage des wertes für den schlüssel "Köln Hbf"
MsgBox % BahnhofsID
MsgBox % BahnhofsArray["Köln Hbf"]
Du verbuxelst (eindimmensionales) Array mit assoziativem Array.

Code: Select all

BahnhofsArray := []   ; "leeres" array
BahnhofsArray.push("kk","Köln Hbf") ; legt zwei items, hier an position 1 und 2 an
BahnhofsID := BahnhofsArray[1]   ; 
MsgBox % BahnhofsID
MsgBox % BahnhofsArray[1]

BoBo
Posts: 3645
Joined: 13 May 2014, 17:15

Re: 2-dimensionales Array auswerten

Post by BoBo » 24 Jul 2020, 05:43

@effel - Kürzel wie Frankfurt (Main) Hoch/Tief (vermutlich die RMV S-Bahnen), was laut Liste "FF H" ergeben würde, funktionieren als Link-parameter nicht. Gibts dazu eine bekannte Lösung?

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

Re: 2-dimensionales Array auswerten

Post by effel » 24 Jul 2020, 06:00

ich gehe mal davon aus, das Betriebsbahnhöfe usw nicht angezeigt werden.
Wenn ich deine Suche in der Abfrage der Bahn für die blaue Tafel eingebe, kommt auch kein Ergebnis

https://www.bahnhof.de/service/search/bahnhof-de/520608?query=Frankfurt+%28Main%29+Hoch%2FTief

hier gehts:
https://www.bahnhof.de/service/search/bahnhof-de/520608?query=k%C3%B6ln+hbf

weitere infos
https://andreas-seier.eu/bahn/a.html

BoBo
Posts: 3645
Joined: 13 May 2014, 17:15

Re: 2-dimensionales Array auswerten

Post by BoBo » 24 Jul 2020, 07:57

Bei der Suche über andreas-seier.eu kann im DropDownMenu Frankfurt Hbf (tief) gewählt werden. Nach Aufruf/Submit werden dann in der Adresszeile einige Parameter aufgeführt. Für diese Station scheint mit dem Kürzel FF H aus der Ausgangsliste nichts zu gehen. Was jedoch funzt ist die Bahnhofnummer
https://iris.noncd.db.de/wbt/js/index.html?
bhf=FF ; FF = Frankfurt Hbf | FF H = Frankfurt Hbf (tief) was aber nicht geht
Zeilen=50

https://iris.noncd.db.de/wbt/js/index.html?
typ=ab
bhf=8098105 ; statt Acronym die Nummer, damit lädt die Seite erfolgreich.
zugtyp=
platform=
bhfname=
style=ab
via=1
impressum=1
lang=de
SecLang=
zeilen=25
paging=
pagingdauer=

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

Re: 2-dimensionales Array auswerten

Post by effel » 24 Jul 2020, 09:46

ja es gibt zwei möglichkeiten die Datenbank anzusprechen. Ich nutze erstmal die andere bis ich die ganze Liste gefunden habe

Code: Select all

FileEncoding, UTF-8
	existListe = Bahnhof_ID_Liste.txt
	if not fileexist(existListe)
	{
		try
		{
		ToolTip Download DBase
		UrlDownLoadToFile, https://ds100.frankfurtium.de/dumps/ds100.html, Bahnhof_ID_Liste.txt
		ToolTip
		}
		catch e
		{
		ErrorMessage	:=	"Ausnahme ausgelöst!`n`nWas: " e.what 
						.	"`nDatei: " e.file
				        .	"`nZeile: " e.line 
						.	"`nNachricht: " e.message 
						.	"`nZusatz: " e.extra
		MsgBox,,ErrorMessage:, % ErrorMessage, 2
		FileAppend, % ErrorMessage, ErrorMessage.txt
		}
   }

	FileRead, bhid, Bahnhof_ID_Liste.txt

	xfa=<tbody>
	yfc=</tbody>
	xIDb=
	xIDb :=xStr(bhid,,xfa,xfc)
	xIDb := StrReplace(xIDb, "</th>`n     <td>", "</th><td>", 1)

	BahnhofsArray := {}   ; 'leeres' associative array

	Loop, Parse, xIDb, `n, `r
	{
		{
		IDa=<th id="
		IDc=">
		ID:=
		ID:=xStr(A_LoopField,,IDa,IDc)
		Citya=<th id="%ID%">%ID%</th><td>
		Cityc=</td>
		City:=
		City:=xStr(A_LoopField,,Citya,Cityc)
		if city<>
		BahnhofsArray[City] := ID
		}
	}

;BahnhofsArray["Köln Hbf"] := "kk"
needle := "Köln Hbf"
MsgBox % BahnhofsArray[needle]
MsgBox % BahnhofsArray["Hamburg-Altona"]
MsgBox % BahnhofsArray["Osinowka Grenze RU"]

Code: Select all

xStr(ByRef H, C:=0, B:="", E:="",ByRef BO:=1, EO:="", BI:=1, EI:=1, BT:="", ET:="") {                           
Local L, LB, LE, P1, P2, Q, N:="", F:=0                 ; xStr v0.97 by SKAN on D1AL/D343 @ tiny.cc/xstr  
Return SubStr(H,!(ErrorLevel:=!((P1:=(L:=StrLen(H))?(LB:=StrLen(B))?(F:=InStr(H,B,C&1,BO,BI))?F+(BT=N?LB
:BT):0:(Q:=(BO=1&&BT>0?BT+1:BO>0?BO:L+BO))>1?Q:1:0)&&(P2:=P1?(LE:=StrLen(E))?(F:=InStr(H,E,C>>1,EO=N?(F
?F+LB:P1):EO,EI))?F+LE-(ET=N?LE:ET):0:EO=N?(ET>0?L-ET+1:L+1):P1+EO:0)>=P1))?P1:L+1,(BO:=Min(P2,L+1))-P1)  
}

effel
Posts: 209
Joined: 16 Jan 2018, 13:34

Re: 2-dimensionales Array auswerten

Post by effel » 24 Jul 2020, 14:16

man kann auch mehr als einen Bahnhof auf einer `blauen` anzeigen lassen.
AbfahrtKöln Hbf, Köln-Nippes, Köln Hansaring
https://iris.noncd.db.de/wbt/js/index.html?bhf=KK,KKHR,KKN&Zeilen=50
damit reduziert sich der Aufwand an die aktuellen Abfahrtzeiten zu kommen erheblich

Post Reply

Return to “Ich brauche Hilfe”