Page 1 of 2

Verwendung von Dateiinhalten

Posted: 24 Feb 2015, 04:30
by fump2000
Hallo zusammen,

ich versuche gerade mit Dateiinhalten klar zu kommen. Per FileOpen wird eine txt Datei geöffnet die etwas derartiges enthält:

Code: Select all

SECTION: Monitors=1,MonitorPrimary=1; Desktop size:0,0,1366,768
Title="Calendar - Paul",x=150,y=0,width=1055,height=728
Title="Inbox - Paul",x=150,y=0,width=1055,height=728
Title="Mozilla Firefox",x=76,y=0,width=1283,height=728
Title="Microsoft Excel",x=120,y=0,width=1246,height=728
Title="Microsoft PowerPoint",x=65,y=0,width=1295,height=728
Title="Reminder",x=623,y=235,width=473,height=336

SECTION: Monitors=2,MonitorPrimary=2; Desktop size:-1920,0,3840,1080
Title="Calendar - Paul",x=-1921,y=0,width=871,height=1080
Title="Inbox - Paul",x=-1056,y=0,width=1055,height=1080
Title="Internet Explorer",x=-1477,y=20,width=1265,height=995
Title="Microsoft PowerPoint",x=291,y=41,width=1506,height=945
Title="Mozilla Firefox",x=180,y=72,width=1359,height=937
Title="Microsoft Excel",x=398,y=17,width=1424,height=996
Title="Reminder",x=623,y=235,width=473,height=336

SECTION: Monitors=1,MonitorPrimary=1; Desktop size:0,0,1920,1080
Title="Calendar - Paul",x=205,y=0,width=871,height=1040
Title="Inbox - Paul",x=127,y=0,width=1055,height=1040
Title="Windows Internet Explorer",x=289,y=46,width=1332,height=955
Title="Mozilla Firefox",x=227,y=17,width=1329,height=968
Title="Microsoft Excel",x=399,y=0,width=1424,height=1040
Title="Microsoft PowerPoint",x=662,y=0,width=1256,height=1040
Title="Reminder",x=623,y=235,width=473,height=336
Das Script selbst ist DockWin aus dem alten Forum.
http://www.autohotkey.com/board/topic/1 ... positions/

Es erstellt anhand der offnen Fenster eine solche Liste. Was es aber nicht kann ist erkennen das eine solche Liste schon existiert aber ein Update erfolgen soll.

Ich habe mir die Hilfe zum FileObjekt angeschaut aber ich kann nicht sagen wie ich damit in der Datei erkennen soll ob TextX schon vorkommt und das dieser in ZeileY steht.
Wenn ich hier einen Updateprozess einbauen will, dann muss ich doch den Datensatz der schon existiert erkennen und deklarieren können.

Dazu sehe ich aber keinen Weg.

Könntet Ihr mir hier bitte auf die Sprünge helfen?

Vielen Dank!

MfG
fump

// Edit:
Das einlesen der Datei und erkennen von Start und Ende habe ich nun so gelöst:

Code: Select all

Loop, Read, %FileName%
	{
		; Einlesen der Daten bis Abschnitt gefunden wurde
		if (A_LoopReadLine<>SectionToFind) {
			if (A_LoopReadLine="" && SectionDublicate=1) {
				PointEnd:=A_Index
				break
			} else {
				Continue
			}
		}
		else {
			SectionDublicate:= 1
			PointStart:=A_Index
		}
	}
msgbox Start: %PointStart% Ende: %PointEnd%
Nun weiß ich wo mein Bereich anfängt und wo er endet aber wie kann ich nun eine Zeile hinzufügen oder ggf. löschen bzw. ersetzen?

Re: Verwendung von Dateiinhalten

Posted: 24 Feb 2015, 09:37
by strobo
das fileobject hat keine fertige methode zum suchen oder zum einfügen (im Sinne von array.insert).
Wieso nicht einfach die Liste neu erstellen lassen (vllt vorher löschen)?

Re: Verwendung von Dateiinhalten

Posted: 24 Feb 2015, 09:52
by fump2000
Weil die Liste mehrere konfigurationen für mehrere Monitorkonfigurationen beinhalten kann.

Wie würdest du denn eine bestimmte Zeile durch einen anderen Text ersetzen?

// Edit:
Andere Frage, mal angenommen ich stell das mit dem FileObjekt um. Lese die Datei komplett ein, kann sie dann genauso durchgehen um start und endpunkt zu erhalten. Wie kann ich eine solche Textzeile in einer Variable löschen oder ersetzen oder eine hinzufügen?

Re: Verwendung von Dateiinhalten

Posted: 24 Feb 2015, 12:08
by strobo
Weil die Liste mehrere konfigurationen für mehrere Monitorkonfigurationen beinhalten kann.
Das schliesst die möglichkeit des neuerstellens oder anhängens (ohne vorher löschen) nicht aus. Um die existenz der SECTIONs muss man sich beim Schreiben kümmern und um die eindeutigkeit der SECTIONs kann man sich beim Auslesen kümmern.
Andere Frage, mal angenommen ich stell das mit dem FileObjekt um. Lese die Datei komplett ein, kann sie dann genauso durchgehen um start und endpunkt zu erhalten. Wie kann ich eine solche Textzeile in einer Variable löschen oder ersetzen oder eine hinzufügen?
Ich glaub da gibts libraries, die dich da unterstützen können, TF (?), string-things irgendwie so hiessen die. Im Endeffekt gehts natürlich darum irgendein Zufalls-Textformat zu parsen, und ich sehe gerade, dass ein grossteils des skripts darauf verwendet wird, dieses Format zu de/enkodieren, vllt kannst du da was abgucken.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 03:11
by just me
Moin fump,

ich bin nicht sicher, ob ich die Fragestellung richtig verstehe. Was willst Du machen?
- Feststellen, ob ein Block bereits vorhanden ist.
- - Ggf. den vorhandenen Block löschen und komplett neu schreiben.
- - Ggf. Teile des vorhandenen Blocks überschreiben.

In jedem Fall ist das Arbeit mit dem Inhalt von Variablen. Ob Du zum Lesen/Schreiben die alten Filekommandos oder das neue Fileobjekt benutzt, macht keinen nennenswerten Unterschied.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 03:46
by fump2000
Moin!

Ja hast du richtig verstanden.
Ich komme mit dem verwenden bzw. Bearbeiten von Dateiinhalten nicht klar.
In dem Script wied die datei per FileObjekt genutzt. Ich habe es nun schon soweit, dass ich folgendes wissen haben:
1. Ich kann sehen ob eine SECTION schon existiert.
2. Ich kann erkennen ab welcher Zeile diese beginnt.
3. Ich erkenne in welcher Zeile sie endet.

Wie kann ich die Datei nun innerhalb dieser Werte um z. B. eine Zeile erweitern oder eine bestimmte Zeile ersetzen bzw. löschen?
Das ist es was ich nicht verstehe...

Kannst du es mir näher bringen?

// Edit:
Also ich bin mir ziemlich sicher, dass ich per Loopen erkennen kann ob ich innerhalb vom Start und Endpunkt den Fenstertitel X schon habe.
Das hilft mir aber nur bedingt denn ich hab keine Ahnung wie ich diese Zeile dann ersetzen kann durch die neuen Werte... Ich sehe keinen Befehl der Zeile X durch String Y ersetzen kann.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 05:19
by just me
Hmmm, wie ich es sehe erzeugt das Skript per Win+Shift+0 für die aktuelle Monitorkonfiguration eine komplette Liste der derzeit offenen Fenster. Diese "Section" wird dann an die Datei angehängt, wenn sie existiert. Wenn dann die Fenster per Win+0 wiederhergestellt werden sollen, wird die Datei allerdings nur bis zur ersten passenden Monitorkonfiguration durchsucht und ggf. die dort gefundenen 'veralteten' Werte verwendet.

Nun nochmal die entscheidende Frage:
Willst Du eine vorhanden 'Section' mit den aktuellen Fensterwerten neu schreiben oder willst Du vorhandene und aktuelle Fensterwerte irgendwie vermischen?

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 06:00
by fump2000
Genau das mit den veralteten möchte ich abstellen bzw. ändern und zwar so, das nicht immer neu geschrieben wird sondern die vorhandene Konfig erweitert wird.

Es gibt Fenster wie Lync z. B. die verändern ihren Titel je nachdem mit wem man zuletzt kommuniziert hat. Sowas soll ergänzt werden. Sollte der Fenstertitel schon vorhanden sein werden jedoch nur die Werte dazu überschrieben bzw. diese Zeile wird ersetzt.

Ich will die SECTION nicht löschen und neu schreiben. Ich will sie ergänzen bzw. Editieren.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 06:08
by jNizM
Schreib doch das DockWin um auf INI... dann kannst du mit den AHK-INI-Funktionen das Ganze viel besser verwalten?!

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 06:19
by fump2000
Auf INI umstellen will ich eigentlich gar nicht... Könnte man aber machen... Sofern es mit dem File ansich nicht geht.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 06:25
by jNizM
Zumindest wäre die Verwaltung um ein vielfaches einfacher.
Und da DockWin nicht gerade groß ist, sollte die Umschreibung auf .ini nicht besonders schwer werden.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 07:16
by strobo
Wie kann ich die Datei nun innerhalb dieser Werte um z. B. eine Zeile erweitern oder eine bestimmte Zeile ersetzen bzw. löschen?
Das ist es was ich nicht verstehe...
Das fileobject hat keine methode zum einfügen/ersetzen/löschen, es überschreibt nur. Wenn du eine Zeile (nicht die letzte) mit z.b. längerem Title ersetzt, überschreibst du den Anfang der nächsten Zeile und die ganze Datei ist kaputt. Deswegen lieber ganz einlesen und als string bearbeiten.


Ini Datei wär schon eine Verbesserung, das Format ist aber dreidimensional (ini ist 2D) und man will bestimmt auch iwo an die x, y, width, ... Werte rankommen. Deswegen sollte man, wenn man schon dabei ist, gleich auf json(, xml, ...) oder
http://ahkscript.org/boards/viewtopic.p ... 14e#p30915
wechseln.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 07:44
by just me
Nun ja, Du kannst die Datei doch mit jedem beliebigen Editor editieren.
Es gibt Fenster wie Lync z. B. die verändern ihren Titel je nachdem mit wem man zuletzt kommuniziert hat. Sowas soll ergänzt werden. Sollte der Fenstertitel schon vorhanden sein werden jedoch nur die Werte dazu überschrieben bzw. diese Zeile wird ersetzt.
Verstehe ich nicht! So riskierst Du doch, dass in der Datei Leichen von irgendwann einmal offenen Fenstern erhalten bleiben. Wozu soll das gut sein?
Ich will die SECTION nicht löschen und neu schreiben.
Du brauchst sie ja nicht zu schreiben. Das erledigt ja das Skript. Und für das Löschen kannst Du eine abgewandelte Version Deiner Suchroutine verwenden:
  • Variable Anhängen auf True setzen.
  • Datei per Loop, Read, ... einlesen, wenn die Variable Anhängen auf True steht, eingelesenen Zeilen um `r`n ergänzen und an eine Variable anhängen.
  • Wenn die eingelesene Zeile mit der gesuchten Section übereinstimmt, Variable Anhängen auf False setzen und nicht anhängen.
  • Wenn die Variable Anhängen auf False steht und eine leere Zeile gelesen wird, Variable Anhängen auf True setzen und nicht anhängen.
Als Ergebnis hat Du dann die Datei ohne die alte Section in einer Variablen. Wenn Du dann das Flag in FileOpen() auf w setzt, kannst Du erst einmal den alten Inhalt schreiben und dann die aktualisierte Section anhängen lassen.

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 07:58
by jNizM
strobo wrote:Ini Datei wär schon eine Verbesserung, das Format ist aber dreidimensional (ini ist 2D) und man will bestimmt auch iwo an die x, y, width, ... Werte rankommen. Deswegen sollte man, wenn man schon dabei ist, gleich auf json(, xml, ...) oder
http://ahkscript.org/boards/viewtopic.p ... 14e#p30915
wechseln.
Oder einfach für jeden Monitor eine .ini Datei und der 'Käs' ist gegessen ;)
Monitor_1.ini

Code: Select all

[Dock Win]
Monitor=1
Monitor_Primary=1

[Mozilla Firefox]
x=76
y=0
w=1283
h=728

[Microsoft Excel]
x=120
y=0
w=1246
h=728

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 08:54
by fump2000
Hach je... Ok dann bau ich mir was eigenes da rein.
Schade das die File geschichte nicht fertig gedacht ist...

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 08:56
by just me
Schade das die File geschichte nicht fertig gedacht ist...
Ist sie schon. Sie kann allerdings nicht wissen, was sich der geneigte Benutzer so denkt. ;)

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 09:19
by fump2000
Also eine Filefunktion die eine bestimmte Zeile die man ja angeben kann durch string xyz ersetzt hätte man doch einbauen können... oder meinste nicht?

file.replace(line,string)

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 09:22
by jNizM
Vielleicht ist in der TF.ahk library (github TF) was vorhanden was du gebrauchen kannst.

Allerdings würde ich dir zwecks einfachere Verwaltung immer noch vorschlagen das Ganze auf .ini um zu stellen.
(IniRead, IniWrite, IniDelete)

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 09:59
by fump2000
Ui das sieht aber vielversprechend aus :)

Danke für den Hinweis!

Re: Verwendung von Dateiinhalten

Posted: 25 Feb 2015, 10:20
by strobo
Ich glaub da gibts libraries, die dich da unterstützen können, TF (?), string-things irgendwie so hiessen die.
Ist mein deutsch zu schlecht? :D