Что нового

Как перейти к следующему циклу, закончив текущий досрочно

vaf

Новичок
Сообщения
164
Репутация
2
Добрый день, у меня казалось бы ерундовая проблема, которую с ходу решить не удалось
дано:
while
wend
между ними куча if, мне нужно чтобы как только первый подходящий if выполнился, цикл начинался заново, т.е. происходил принудительный wend.

Заранее спасибо за помощь.
 

Guezt

Продвинутый
Сообщения
335
Репутация
81
Есть же другие операторы например:
Код:
Case

хотя непонятно у тебя вложены If друг в друга или независимы, можно код глянуть?
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
vaf
вместо кучи if ставь if, elseif
 

SyDr

Сидра
Сообщения
651
Репутация
158
ContinueLoop для этого предназначен.
 

gregaz

AutoIT Гуру
Сообщения
1 166
Репутация
299
vaf [?]
между ними куча if, мне нужно чтобы как только первый подходящий if выполнился, цикл начинался заново, т.е. происходил принудительный wend.
Условия :

цикл бы начинался заново
и
происходил принудительный wend

это совершенно противоположные условия.

Здесь цикл начинается заново :
Код:
$i=1

While $i<10
	$i+=1
	If $i=5 Then $i=1
	ConsoleWrite($i& @LF)
WEnd	
ConsoleWrite("Wend"& @LF)

т.е превращается в бесконечный цикл

Здесь выполнен принудительный wend:
Код:
$i=1

While $i<10
   $i+=1
   If $i=5 Then ExitLoop
   ConsoleWrite($i& @LF)
WEnd
ConsoleWrite("End" @LF)

и происходит выход из цикла
Кстати при использованиии ContinueLoop :
Код:
$i=1

While $i<10
	$i+=1
	If $i=5 Then ContinueLoop
	ConsoleWrite($i& @LF)
WEnd	
ConsoleWrite("Wend"& @LF)

происходит только пропуск одного значения (переход к следующему)
А Что тебя интересует ???
 
Автор
V

vaf

Новичок
Сообщения
164
Репутация
2
if у меня не вложены, просто их в цикле много. Код - только не пугайтесь
Код:
$pf = 0
$sf = 0
$who = ", сеть супермаркетов"
$n = 1
$file = FileOpenDialog ("Выберите файл", "C:\", "Text (*.txt)", 1)

If $file = -1 Then
    MsgBox(0, "Error", "Unable to open file.")
    Exit
EndIf

; Read in lines of text until the EOF is reached
While 1
    $line = FileReadLine($file, $n) ; Считываем строки
    If @error = -1 Then ExitLoop

	MsgBox (0, $pf, $line)
	if StringInStr ($line, $who) <> 0 Then ; Если попалась $who (мы впервые нашли то что искали)
		MsgBox (0, "","Найдено предприятие")
		$predpr = StringLeft ($line, StringInStr ($line, $who)-1)
		MouseClick ("left", 710, 507)
		Sleep (50)
		ClipPut ($predpr)
		Send("^v")
		MouseClick ("left", 710, 538)
		ClipPut ("Россия")
		Send("^v")
		MouseClick ("left", 710, 570)
		ClipPut ("Пензенская")
		Send("^v")
		MouseClick ("left", 710, 600)
		ClipPut ("Пенза")
		Send("^v")
		$pf = 1 ; Выставляем прзнак того, что мы нашли наше предприятие
	EndIf
	
	If $pf = 1 Then ; $sf = 1 Then ; Если выставлен признак того, что мы находили ранее улицу, то забиваем наши данные (попробовать заменить на $pf, т.к. признака предприятия думаю достаточно
		MouseClick ("left", 70,40)
		sleep (2500)
		
		;Sleep (250)
		;Send ("{PGDN}")
		;Sleep (250)
		;Send ("{PGDN}")
		;;Sleep (250)
		;MouseClick ("left", 481, 552)
		;Sleep (250)
		;MouseClick ("left", 548, 607)
		;Sleep (250)
		;MouseClick ("left", 1245, 431)
		;Sleep (250)
		;MouseClick ("left", 455, 963)
		;Sleep (250)
		;MouseClick ("left", 1356, 991)
		;Sleep (5000)
		;MouseClick ("left", 1565, 291)
		;Sleep (5000)
		
		
		
		
		
		MouseClick ("left", 710, 507)
		Sleep (50)
		ClipPut ($predpr)
		Send("^v")
		MouseClick ("left", 710, 538)
		ClipPut ("Россия")
		Send("^v")
		MouseClick ("left", 710, 570)
		ClipPut ("Пензенская")
		Send("^v")
		MouseClick ("left", 710, 600)
		ClipPut ("Пенза")
		Send("^v")
	EndIf

	
	if StringInStr ($line, "ул.") <> 0 Then ; Если попалась "ул."
		$street = StringMid ($line, StringInStr ($line, "ул.")+4) ; Отрезаем слово "ул."
		$sPattern="\s*(\d+?\D?)\s*($|\r\n)"
		$sReplace=", \1\2"
		$sNewText=StringRegExpReplace($street,$sPattern,$sReplace)
		If $pf = 1  Then ; Если есть признак того, что предприятие уже вбивалось, а в строчке есть "ул.", это значит что это то же самое предприятия - печатаем улицу
			$sf = 1 ; Выставляем признак того, что мы вбили улицу
			MouseClick ("left", 710, 625)
			ClipPut ($sNewText)
			Sleep (500)
			Send("^v")
		EndIf
	EndIf
		

	if StringInStr ($line, "пр-кт") <> 0 Then ; Если попалось "пр-кт"
		$line = StringReplace ($line, "пр-кт", "ул. Проспект ")
		$street = StringMid ($line, StringInStr ($line, "ул.")+4) ; Отрезаем слово "ул."
		$sPattern="\s*(\d+?\D?)\s*($|\r\n)"
		$sReplace=", \1\2"
		$sNewText=StringRegExpReplace($street,$sPattern,$sReplace)
		If $pf = 1  Then ; Если есть признак того, что предприятие уже вбивалось, а т.к. в строчке есть "ул.", это значит что это то же самое предприятия - печатаем улицу
			$sf = 1 ; Выставляем признак того, что мы вбили улицу
			MouseClick ("left", 710, 625)
			ClipPut ($sNewText)
			Sleep (500)
			Send("^v")
		EndIf
	EndIf

	$phone = StringReplace ($line, chr(09), "")
	$phone = StringReplace ($phone, " ", "")
	If StringIsDigit (StringLeft ($phone, 1)) = 1 Then ; Если первый символ в строке числовой, значит это номер телефона
		If $pf = 1 Then ; а т.к. у нас есть признак того, что мы вбили предприятие, то печатаем этот номер телефона
			MouseClick ("left", 710, 746)
			Sleep (500)
			Send ($phone)
		EndIf
	EndIf
	
	If StringInStr ($line, "www") <> 0 Then ; Если попалась "www.", значит нашли сайт предприятия
		$www = StringReplace ($line, chr(09), "") ; Избавляемся от знаков табуляции и пробелов
		$www = StringReplace ($www, " ", "")
		If $pf = 1 Then ; И если унас есть признак того, что предприятие уже вбито, то печатаем его
			MouseClick ("left", 710, 687)
			Sleep (500)
			Send ($www)
		EndIf
	EndIf

	If StringInStr ($line, "@") <> 0 Then ; Если попалась "@", нашли адрес электронной почты
		$email = StringReplace ($line, chr(09), "")
		$email = StringReplace ($email, " ", "")
		If $pf = 1 Then ; И если унас есть признак того, что предприятие уже вбито, то печатаем его
			MouseClick ("left", 710, 658)
			Sleep (500)
			Send ($email)
		EndIf
	EndIf


If StringLen ($line) = 0 Then ; Если попалась строка нулевой длины, значит предприяте закончилось, признак предприятия сбрасываем
		$pf = 0
		$sf = 0
	EndIf

	$n+=1
Wend

В кратце что он делает: дан файлик такими данными (список длинный)

[box title=Содержимое файла]
Спар, сеть супермаркетов
-------------------------------------------------------------------------------
www.spar.ru
[email protected]
ул. Ладожская 111а
40-53-33
пр-кт Строителей 33
44-37-91
ул. Карпинского 39
42-49-10
ул. Свердлова 9 /  Гоголя 54
ул. Кулакова 10
55-61-42
ул. Терновского 183
20-37-03
20-37-04
20-37-02
ул. Тепличная 15
ул. Коннозаводская 2а
ул. 8 Марта 20
ул. Клары Цеткин 25а
пр-кт Строителей 40
пр-кт Победы 83
ул. Кулакова 1

Магнит, сеть супермаркетов
-------------------------------------------------------------------------------
ул. Свердлова 9 /  Гоголя 54
ул. Кулакова 10
55-61-42
ул. Терновского 183
20-37-03
20-37-04
[/box]
На выходе должно быть: (первый проход цикла)
$name = "Спар"
$www = "www.spar.ru"
$mail = "[email protected]"
$street = "ул. Ладожская, 111а"
$phone = "40-53-33"

второй проход цикла

$name = "Спар"
$www = ""
$mail = ""
$street = "пр-кт Строителей 33"
$mail = "[email protected]"
$street = "ул. Ладожская, 111а"
$phone = "44-37-91"

Форматирование исходного файла в точности такое как я привел в примере, т.е.
Название магазина
-------------------------------------------------------------------------------
адреса
телефоны
иногда мыло
иногда сайт

а нужна полная информация по каждой улице. я понимаю где я совершил ошибку, но ума не приложу, как сделать корректно.
В 2х словах, чтобы понять что мне нужно - автоматизировать ввод вот этого

[box title=Содержимое файла]
Магнит, сеть супермаркетов
-------------------------------------------------------------------------------
ул. Медицинская 5
пр-кт Строителей 24а
ул. Беляева 6
ул. Одесская 1
пр-кт Строителей 63
пр-кт Строителей 50а
ул. Мусоргского 26а
ул. Московская 102
ул. Терновского 251
ул. Терновского 98
ул. Луначарского 30
ул. Чаадаева 29
ул. Дзержинского 35
49-24-57
ул. Аустрина 152а
ул. Воронова 8
ул. Злобина 52а
56-05-45
ул. Рахманинова 27
ул. Кижеватова 1
пр-кт Победы 126


Магнит, торговый центр
-------------------------------------------------------------------------------
пр-кт Строителей 50а
43-72-04



Перекресток, сеть супермаркетов
-------------------------------------------------------------------------------
www.perekrestok.ru
ул. Суворова 144а
26-00-20
26-00-01
пр-кт Строителей 9



Спар, сеть супермаркетов
-------------------------------------------------------------------------------
www.spar.ru
[email protected]
ул. Ладожская 111а
40-53-33
пр-кт Строителей 33
44-37-91
ул. Карпинского 39
42-49-10
ул. Свердлова 9 /  Гоголя 54
ул. Кулакова 10
55-61-42
ул. Терновского 183
20-37-03
20-37-04
20-37-02
ул. Тепличная 15
ул. Коннозаводская 2а
ул. 8 Марта 20
ул. Клары Цеткин 25а
пр-кт Строителей 40
пр-кт Победы 83
ул. Кулакова 1


Тендер, ЗАО, Пензенский филиал
-------------------------------------------------------------------------------
ул. Мусоргского 26а
46-47-73
46-34-41


Товарищ, сеть супермаркетов
-------------------------------------------------------------------------------
ул. Клары Цеткин 55
57-64-00
ул. Дзержинского 33
49-15-31
ул. Антонова 7
69-77-56
ул. Мира 6
68-37-16
ул. Карпинского 37
55-65-38
ул. Кижеватова 8
31-22-63
ул. Коммунистическая 35
42-58-54
пр-кт Победы 79
95-61-00
ул. Депутатская 10
57-83-87


Фортуна, минимаркет
-------------------------------------------------------------------------------
пр-кт Победы 138
43-37-57
[/box]
на свой сайт
http://rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
vaf
общие замечания
1. у тебя есть вложенный циклы
2. скрипт - такая большая каша, и некоторые строки, не понятно что делают, к примеру
Код:
MouseClick ("left", 710, 507)
        Sleep (50)
        ClipPut ($predpr)
        Send("^v")
        MouseClick ("left", 710, 538)
        ClipPut ("Россия")

если передают данные на какой-то софт, то возможно есть вероятность передавать сразу в нужные поля, если же это непосредственно вебсайт, то можно автоматизировать на уровне IE.au3.
3. циклы после 1-го можно засунуть в цикл 1, и не нужно будет проверять никакие флаги.
4. сбрасывание флага происходить не будет, т.к. при возникновении строки нулевой длины (а таких строк нет, только конец файла может ознаменовать нулевую строку) скрипт завершится не дойдя до этого места цикла. смотри строчку
Код:
If @error = -1 Then ExitLoop

5. в некоторых местах скрипта замена символов почему то реализовано через StringRegExp. зачем?
 
Автор
V

vaf

Новичок
Сообщения
164
Репутация
2
в некоторых местах скрипта замена символов почему то реализовано через StringRegExp. зачем?
а мне нужно было улицу от номера дома отделить запятой (в оригинале пробел), а т.к. улицу бывают многословные, то пробел будет встречаться часто, нужно было менять именно последний пробел, вот и реализовано через
StringRegExp
Код:
MouseClick ("left", 710, 507)
        Sleep (50)
        ClipPut ($predpr)
        Send("^v")
        MouseClick ("left", 710, 538)
        ClipPut ("Россия")
Запоминает в буфер обмена значение переменной $predpr, а посл чего вставляет его в нужную мне форму в IE. Почему не сделал через Send, потому что Send например при передачи символа "," на русском языке передает "б". Проще и быстрее вставить из буфера

P.S. Можно поподробнее об IE.au3 ?
 
Автор
V

vaf

Новичок
Сообщения
164
Репутация
2
Нашел примеры. Странно вот этот код работает.
Код:
#include <IE.au3>
$oIE = _IECreate ("http://www.google.com")
$oForm = _IEFormGetObjByName ($oIE, "f")
$oQuery = _IEFormElementGetObjByName ($oForm, "q")
_IEFormElementSetValue ($oQuery, "AutoIt IE.au3")
_IEFormSubmit ($oForm)
А начинаю применять на своем сайте rccat.ru не работает, я уже запарился - подскажите, рабочий кусочек программы, хотя бы для одного элемента, дальше я сам.
Код:
#include <IE.au3>
$oIE = _IECreate ("http://www.rccat.ru/index.php?option=com_sobi2&sobi2Task=addNew&Itemid=1")
$oForm = _IEFormGetObjByName ($oIE, "f")
$oQuery = _IEFormElementGetObjByName ($oForm, "field_entry_name")
_IEFormElementSetValue ($oQuery, "Привет")
_IEFormSubmit ($oForm)
 
Автор
V

vaf

Новичок
Сообщения
164
Репутация
2
Разобрался сам.тему можно закрывать
 

kaster

Мой Аватар, он лучший самый
Команда форума
Глобальный модератор
Сообщения
4 020
Репутация
622
vaf
отметь тему решенной
 
Верх