LoopReadLine begrenzen?

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

diabloGT
Posts: 4
Joined: 11 Jul 2018, 03:45

LoopReadLine begrenzen?

09 Oct 2018, 15:20

Hallo zusammen,

ich habe ein Script, mit dem ich Daten aus einer .csv-Datei ziehe und eine DropDownList damit befülle, um dann noch verschiedene Sachen mit den Daten zu machen. Nun ist es so, das die gesamte Zeile aus der .csv-Datei gelesen wird. Ich brauche allerdings nur die ersten zwei Spalten (bzw. bis zum zweiten Semikolon, die Spalten sind in der DDL durch Semikolon getrennt).
Hier ein Auszug aus meinem bisherigen Code:

Code: Select all

list := []
listCount := 0

Loop, Read, C:\...\test.csv
{
	list := list . "|" . A_LoopReadLine
}
Ich müsste den String dann wahrscheinlich mit einem Loop parsen, wenn ich es bisher richtig verstanden habe. Ich bin mit der Syntax leider nicht klar gekommen und würde mich über Hilfe freuen :)
User avatar
nnnik
Posts: 3374
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: LoopReadLine begrenzen?

09 Oct 2018, 15:37

Du kannst jeden Loop jederzeit abbrechen indem du den break Befehl ausführst.
Da in jedem Loop die variable A_Index hochgezählt wird kannst du mit

Code: Select all

if (A_Index = 3) {
	break
}
jeden loop nach der 2. (in der 3.) Wiederholung abbrechen.

Was mir auffällt ist, dass du list als array initialisierst, diese variable dann aber mit einem String überschreibst.
In AHK (wie in vielen anderen Sprachen auch) ist ein String kein Array gefüllt mit Buchstaben.
In AHK sind das 2 verschiedene Dinge die nichts miteinander zu tun haben.
v2 würde dir eventuell einen Fehler ausgeben, v1 wird es ignorieren.
Es ist aber besser wenn du list := "" verwendest.
Recommends AHK Studio
diabloGT
Posts: 4
Joined: 11 Jul 2018, 03:45

Re: LoopReadLine begrenzen?

09 Oct 2018, 15:44

bei A_Index geht es aber um den Zeilenindex, wenn ich richtig verstanden habe? Ich wollte allerdings jede Zeile nur bis zu einem gewissen Punkt auslesen, und nicht komplett
User avatar
LuckyJoe
Posts: 133
Joined: 02 Oct 2013, 09:52

Re: LoopReadLine begrenzen?

10 Oct 2018, 01:15

Kannst du mit dem Excel-Object darauf zugreifen?

Code: Select all

Excel     := ComObjActive("Excel.Application")		; aktuell laufende Excel Instanz
; Excel 	  := ComObjCreate("Excel.Application") ; startet eine neue Excel Instanz
WorkBook  := Excel.ActiveWorkbook					; aktuell geöffnete Datei
Sheet     := Excel.ActiveSheet						; aktuell geöffnete Tabelle
Cell      := Excel.ActiveCell						; aktuelle Zelle
Zellwert  := Cell.Value								; Wert der aktuellen Zelle
Zellwert2 := Cell.Offset(0,1).Value					; Wert der aktuellen rechten Nachbarzelle
... dann könntest du darüber eine Lösung finden.

Viel Erfolg! - Lucky Joe
User avatar
nnnik
Posts: 3374
Joined: 30 Sep 2013, 01:01
Location: Germany

Re: LoopReadLine begrenzen?

10 Oct 2018, 04:43

Du könntest hier entweder inStr in Kombination mit subStr verwenden oder StrSplit verwenden.
Weiterhin gibt es die Möglichkeit einen Parse Loop zu verwenden und nach der 2. Iteration abzubrechen.
Recommends AHK Studio
just me
Posts: 5519
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: LoopReadLine begrenzen?

10 Oct 2018, 08:52

Moin,

Dateien sind an sich nur eine willkürliche Folge von Bytewerten. Wenn man sie bearbeiten will, muss man in der Regel ihre interne Struktur kennen.

Textdateien im Sinne von AHK beinhalten einen lesbaren Text, der in der Regel in einzelne Zeilen aufgeteilt ist. Solche Dateien unterstützt AHK mit Anweisungen, die die Daten zeilenweise einlesen. Das bedeutet aber letzlich nur, dass AHK dem Programmierer die Suche nach den Zeilenumbrüchen abnimmt. Darüberhinaus gibt es keinen weiteren Komfort. Wenn Du nur Teile von Zeilen haben willst, musst Du selbst Hand anlegen (siehe nnnnik's Antwort).
User avatar
LuckyJoe
Posts: 133
Joined: 02 Oct 2013, 09:52

Re: LoopReadLine begrenzen?

10 Oct 2018, 09:57

... oder - falls du auf Excel zugreifen kannst - du nimmst AHK zum komfortablen und einfachen Auslesen via ComObject ;-)
just me
Posts: 5519
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: LoopReadLine begrenzen?

10 Oct 2018, 15:50

... um die ersten zwei Felder jeder Zeile einer CSV-Datei abzugreifen, braucht AHK definitiv keine Unterstützung durch COM-Excel. ;)
User avatar
divanebaba
Posts: 744
Joined: 20 Dec 2016, 03:53
Location: Diaspora

Re: LoopReadLine begrenzen?

10 Oct 2018, 17:38

just me wrote:... um die ersten zwei Felder jeder Zeile einer CSV-Datei abzugreifen, braucht AHK definitiv keine Unterstützung durch COM-Excel. ;)
Stimmt. AHK und ein bißchen Grips oder ein hilfreicher Hinweis, reicht vollkommen.

Vielleicht so?

Code: Select all

list := ""
; listCount := 0

FileRead, data, C:\...\test.csv ; Ich mag es, Dateien komplett zuvor einzulesen, außer ich benötige nur wenige Zeilen der Datei
loop, parse, data, `n, `r
{
	a := StrSplit(A_LoopField, "`;")
	list .= "|" . a.1 . "`;" . a.2
}
list := LTrim(list, "|")
msgbox % list
return
Aus Mangel an detaillierten Informationen, habe ich mich für ein Semikolon, als Trennzeichen, entschieden.
Das Ergebnis sollten Pipe-getrennte Paare sein, die ihrerseits durch ein Semikolon getrennt sind.
[Starklichtbirne IQ >> 250!!] Dank deutscher Lehrerempfehlung, nur Süperdepp und Hartz4-Bezieher, statt Abitürient und Einkommensbezieher.
[Strong light bulb IQ >> 250!!] Thanks to german teacher's recommendation, willful and welfare recipient, instead of high school graduate and moneymaker.

Entering high school for foreign children is not prohibited in GERMANY, it's only made nearly impossible by government.
Virtually the only way - visiting high school abroad.

ADVERTISING: Patent pending strip accumulator - süper advanced technology - priceless inexpensive, space-saving, energy efficient - Patent priority for sale.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: Google [Bot] and 7 guests