Показать полную графическую версию : [решено] Разбор строк из текстового поля
eus_deus
27-08-2013, 19:14
Всем привет!
В текстовом поле edit1 имеется текст вида
1 строка
2 строка
3 строка
4 строка
5 строка
6 строка
7 строка
Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка такого вида:
M 5 строка#!#4 строка#!#2 строка#!#1 строка
И еще может понадобиться всесто всей третьей строки извлечение только ее части и вставка в код выше.
Спасибо за советы!
Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка такого вида:
M 5 строка#!#4 строка#!#2 строка#!#1 строка »
По какому принципу из текста получается такая строка?
eus_deus
27-08-2013, 21:09
По какому принципу из текста получается такая строка? »
Ответ здесь
Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка »
Она нигде еще не получается, но мне нужна строка такого вида. Может, текст не такой будет, может разделитель, может не те номера строк - хочу общий принцип понять, а допереть не могу.
Строки в одну сливаю с разделителем, а вот как их выставить в порядке не соображу
Ответ здесь… »
«Здесь» — нет ответа.
Но, Снежная Королева, нельзя из букв «Ж», «О», «П» и «А» — сложить слово «Вечность».
Объясните, что за «M » в начале результирующей строки, откуда она берётся, по какому принципу? Растолкуйте, куда пропала третья исходная строка, почему она отсутствует в результирующей; если надо исключать какие-то строки при слиянии, то, опять же — по какому принципу.
А Вы говорите «Ответ здесь» :(.
Строки в одну сливаю с разделителем, а вот как их выставить в порядке не соображу »
В каком порядке? В обратном что ли?
eus_deus
28-08-2013, 14:27
Iska, итак, по порядку читаем.
В каком порядке? В обратном что ли? »
Порядок строк указан - 5,4,2,1, каторые разделены символами #!#. Это видно в моем сообщении:
M 5 строка#!#4 строка#!#2 строка#!#1 строка »
Касательно этого вопроса
Объясните, что за «M » в начале результирующей строки, откуда она берётся, по какому принципу? »
могу ответить - в начале строки которую я хочу получить, должен стоять текст - неважно, М это или Р или Т - важен способ его попадания туда. Он ниоткуда не береться, его в строках нет, но он там нуженесли надо исключать какие-то строки при слиянии, то, опять же — по какому принципу »
Третья строка, если и понадобиться, то только ее часть. А так она там не нужна, равно как и седьмая
Iska, теперь вопрос у меня я написал, какой вид у меня имеется и что я хочу получать. Вид и порядок строк указаны с самого начала. Для успеха получения кода этого хватает.. Следующим вашим вопросом будет - зачем мне буква М и почему нужны строки в таком порядке? Если так, то давайте просто закроем тему, так как она пользы и знаний не принесет ни мне, ни другим участникам форума
eus_deus, не надо язвить. Приводите необходимую и достаточную информацию сразу — не будет возникать уточняющих вопросов.
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
#include <Array.au3>
$Form1 = GUICreate("Form1", 440, 200, 320, 240)
$Edit1 = GUICtrlCreateEdit(StringReplace("First;Second;Third;Fourth;Fifth;Sixth;Seventh;Eighth", ";", @CRLF), 8, 8, 153, 161)
$Edit2 = GUICtrlCreateEdit("", 153 + 8 * 2, 8, 153, 161)
$Button1 = GUICtrlCreateButton("Button1", 153 * 2 + 8 * 4, 8, 89, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$aValues = StringSplit(GUICtrlRead($Edit1), @CRLF, 1)
_ArrayDelete($aValues, 7)
_ArrayDelete($aValues, 3)
_ArrayDelete($aValues, 0)
_ArrayReverse($aValues)
GUICtrlSetData($Edit2, _ArrayToString($aValues, @CRLF))
EndSwitch
WEnd
http://img16.imageshack.us/img16/882/nj3y.png
eus_deus
28-08-2013, 15:43
Iska, язвить и не думал - задал встречный вопрос. Мне просто казалось, что приведенной информации хватит - имею то-то, хочу получить то-то... Спасибо вам за внимание
Iska, а строки выстроены в вашем примере просто в обратном порядке с удалением третьей и седьмой строки? Я же делал акцент на порядке строк - 5,4,2,1. Спасибо на этом, буду копать в библиотеке работы с массивами. Еще текст добавлять надо все равно
Iska, а строки выстроены в вашем примере просто в обратном порядке с удалением третьей и седьмой строки? »
Да. Вы упоминали ещё про седьмую:
А так она там не нужна, равно как и седьмая »
посему я взял для примера восемь строк. После разбиения строки на подстроки («StringSplit()») нулевой элемент полученного массива содержит количество элементов, потому его удаляем перед обращением порядка элементов массива («_ArrayReverse()»). Удалять лишние/ненужные элементы удобнее с конца.
Я же делал акцент на порядке строк - 5,4,2,1. »
В принципе, ничто не мешает просто взять полученный разбиением массив и склеить потребные элементы (если Вы уверены в их наличии):
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <WindowsConstants.au3>
;#include <Array.au3>
$Form1 = GUICreate("Form1", 440, 200, 320, 240)
$Edit1 = GUICtrlCreateEdit(StringReplace("First;Second;Third;Fourth;Fifth;Sixth;Seventh;Eighth", ";", @CRLF), 8, 8, 153, 161)
$Edit2 = GUICtrlCreateEdit("", 153 + 8 * 2, 8, 153, 161)
$Button1 = GUICtrlCreateButton("Button1", 153 * 2 + 8 * 4, 8, 89, 25)
GUISetState(@SW_SHOW)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
$aValues = StringSplit(GUICtrlRead($Edit1), @CRLF, 1)
;_ArrayDelete($aValues, 7)
;_ArrayDelete($aValues, 3)
;_ArrayDelete($aValues, 0)
;_ArrayReverse($aValues)
;GUICtrlSetData($Edit2, _ArrayToString($aValues, @CRLF))
GUICtrlSetData($Edit2, $aValues[5] & @CRLF & $aValues[4] & @CRLF & $aValues[2] & @CRLF & $aValues[1])
EndSwitch
WEnd
eus_deus
28-08-2013, 16:22
Iska, это уже практически все, что я искал. Функция имее вид
Func _Convert()
$aS=StringSplit(GUICtrlRead($Edit1),@CRLF,1)
GUICtrlSetData($Edit2, $aS[5] & "#!#" & $aS[4] & "#!#" & $aS[2] & "#!#" & $aS[1])
EndFunc
Осталось к результату спереди добавить текст и сделать выборку части третьей строки, может понадобиться. Но в целом - вопрос решен
eus_deus
28-08-2013, 19:14
Iska, хорошо. В принципе могу уже свистеть.
Строка
GUICtrlSetData($Edit2, $aS[5] & "#!#" & $aS[4] & "#!#" & $aS[2] & "#!#" & $aS[1])
содержит пробелы. Как от них избавиться в конечном результате? Кстати, если сильно надоедаю, то разрешаю меня послать)))) Я с autoit знаком три дня, хочу научится, а для этого надо решать задачу, к которой есть личный интерес, а не писать скрипты "Привет мир".
И касательно третьей строки... Посмотрел - надо все таки вытягивать с нее часть.
Вид у нее такой
my_icons.dll,101
Вот тот номер после запятой мне и нужен.В данном случае 101. Предполагаю, что нужна работа с регулярными выражениями. С связи с этим еще вопрос - у кого есть утилита regexp для работы с ними? А то с сайта ее скачать не могу - страница не открывается
madmasles
28-08-2013, 19:33
eus_deus, $sString = 'строка с пробелами' & @TAB (http://autoit-script.ru/autoit3_docs/macros.htm#@tab) & ' и еще одна ' & @CR (http://autoit-script.ru/autoit3_docs/macros.htm#@cr) & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf) & 'и еще строка '
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)('До: >' & $sString & '<' & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
$sString = StringStripWS (http://autoit-script.ru/autoit3_docs/functions/StringStripWS.htm)($sString, 8)
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)('После: >' & $sString & '<' & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)('---' & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
$sString = 'Мне нужно только то, что после последней запятой, и до конца строки,123'
$sString = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sString, '^.*,', '')
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
eus_deus
28-08-2013, 19:42
madmasles, с числом и регуляркой - это точно мое. а вот с пробелами пока не понял, пошел смотреть внимательнее
сообщаю. не знаю, как так, но пробелов сейчас нет. Выбор числа в строке - отлично. Всплыла новая проблема. Функция
Func _Convert()
$aS=StringSplit(GUICtrlRead($Edit1),@CRLF,1)
$sIco = StringRegExpReplace($aS[4], '^.*,', '')
$aResult=$aS[5]&"#!#"&$sIco&"#!#"&$aS[2]&"#!#"&$aS[3]
GUICtrlSetData($Edit2,"M " & $aResult)
EndFunc
работает как и ожидалось, но что делать, если строка $aS[3] пустая? Тогда функция мне пишет в конец строки символы #!#, которые там не нужны. Проблема в том, что строка может быть пустой, а может и нет. Какое то условие, если на конце строки стоит #!#, то удалять его нафиг?
madmasles
28-08-2013, 20:16
eus_deus, Local (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sString = '', $sDelim = '#!#'
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 5
$sString &= ' String ' & $i & ' ' & $sDelim
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
$sString = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sString, $sDelim & '$', '')
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
$sString = StringStripWS (http://autoit-script.ru/autoit3_docs/functions/StringStripWS.htm)($sString, 8)
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))ИлиLocal (http://www.autoitscript.com/autoit3/docs/keywords.htm#Local) $sString = '', $sDelim = '#!#'
For (http://www.autoitscript.com/autoit3/docs/keywords.htm#For) $i = 1 To (http://www.autoitscript.com/autoit3/docs/keywords.htm#To) 5
$sString &= ' String ' & $i & ' ' & $sDelim
Next (http://www.autoitscript.com/autoit3/docs/keywords.htm#Next)
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
$sString = StringRegExpReplace (http://autoit-script.ru/autoit3_docs/functions/StringRegExpReplace.htm)($sString, $sDelim & '$|\s+', '')
ConsoleWrite (http://autoit-script.ru/autoit3_docs/functions/ConsoleWrite.htm)($sString & @LF (http://autoit-script.ru/autoit3_docs/macros.htm#@lf))
Кстати, если сильно надоедаю, то разрешаю меня послать)))) »
С чего бы это ;)? Форум для того и создан, чтобы «надоедали», повышая квалификацию.
По остальному решение изложил коллега madmasles.
madmasles, только сейчас заметил, что теперь ссылки ведут на перевод документации на русскоязычном сообществе.
eus_deus
28-08-2013, 20:36
Iska, да, я уже пытаюсь вникнуть в коды коллеги madmasles'a. Правда, боюсь, пока они для меня слишком сложны, но я стараюсь понять))
madmasles
28-08-2013, 20:53
теперь ссылки ведут на перевод документации на русскоязычном сообществе. »Давно уже так.
они для меня слишком сложны, но я стараюсь понять »Если что-то непонятно, спрашивайте.
eus_deus
28-08-2013, 20:55
madmasles, ругается при работе на строку
$sString &= $Result2 & $i & ' ' & $sDelim
знак & перед равенством пробовал удалять - без толку
Функция
Func _Convert()
$aS=StringSplit(GUICtrlRead($Edit1),@CRLF,1)
$sIco = StringRegExpReplace($aS[4], '^.*,', '')
$aResult=$aS[5]&"#!#"&$sIco&"#!#"&$aS[2]&"#!#"&$aS[3]
$aResult2=StringStripWS ( $aResult, 8 )
Local $sString = '', $sDelim = '#!#'
For $i = 1 To 5
$sString = $Result2 & $i & ' ' & $sDelim
Next
ConsoleWrite($sString & @LF)
$sString = StringRegExpReplace($sString, $sDelim & '$|\s+', '')
ConsoleWrite($sString & @LF)
GUICtrlSetData($Edit2,"M " & $sString)
EndFunc
Давно уже так. »
Год-два? Разве это давно?! ;)
madmasles
28-08-2013, 21:20
ругается при работе на строку »У Вас нет переменной $Result2
Год-два? Разве это давно?! »Для меня давно то, даты появления чего я уже не помню. :)
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.