Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   AutoIt (http://forum.oszone.net/forumdisplay.php?f=103)
-   -   [решено] Разбор строк из текстового поля (http://forum.oszone.net/showthread.php?t=266989)

eus_deus 27-08-2013 19:14 2208679

Разбор строк из текстового поля
 
Всем привет!
В текстовом поле edit1 имеется текст вида
Код:

1 строка
2 строка
3 строка
4 строка
5 строка
6 строка
7 строка

Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка такого вида:
Код:

M 5 строка#!#4 строка#!#2 строка#!#1 строка
И еще может понадобиться всесто всей третьей строки извлечение только ее части и вставка в код выше.
Спасибо за советы!

Iska 27-08-2013 21:04 2208731

Цитата:

Цитата eus_deus
Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка такого вида:
Код:

M 5 строка#!#4 строка#!#2 строка#!#1 строка
»

По какому принципу из текста получается такая строка?

eus_deus 27-08-2013 21:09 2208735

Цитата:

Цитата Iska
По какому принципу из текста получается такая строка? »

Ответ здесь
Цитата:

Цитата eus_deus
Нужна функция для кнопки button1, при нажатии на какую в текстовом поле edit2 получилась бы одна строка »

Она нигде еще не получается, но мне нужна строка такого вида. Может, текст не такой будет, может разделитель, может не те номера строк - хочу общий принцип понять, а допереть не могу.
Строки в одну сливаю с разделителем, а вот как их выставить в порядке не соображу

Iska 28-08-2013 02:12 2208914

Цитата:

Цитата eus_deus
Ответ здесь… »

«Здесь» — нет ответа.
Цитата:

Но, Снежная Королева, нельзя из букв «Ж», «О», «П» и «А» — сложить слово «Вечность».
Объясните, что за «M » в начале результирующей строки, откуда она берётся, по какому принципу? Растолкуйте, куда пропала третья исходная строка, почему она отсутствует в результирующей; если надо исключать какие-то строки при слиянии, то, опять же — по какому принципу.

А Вы говорите «Ответ здесь» :(.

Цитата:

Цитата eus_deus
Строки в одну сливаю с разделителем, а вот как их выставить в порядке не соображу »

В каком порядке? В обратном что ли?

eus_deus 28-08-2013 14:27 2209121

Iska, итак, по порядку читаем.
Цитата:

Цитата Iska
В каком порядке? В обратном что ли? »

Порядок строк указан - 5,4,2,1, каторые разделены символами #!#. Это видно в моем сообщении:
Цитата:

Цитата eus_deus
M 5 строка#!#4 строка#!#2 строка#!#1 строка »

Касательно этого вопроса
Цитата:

Цитата Iska
Объясните, что за «M » в начале результирующей строки, откуда она берётся, по какому принципу? »

могу ответить - в начале строки которую я хочу получить, должен стоять текст - неважно, М это или Р или Т - важен способ его попадания туда. Он ниоткуда не береться, его в строках нет, но он там нужен
Цитата:

Цитата Iska
если надо исключать какие-то строки при слиянии, то, опять же — по какому принципу »

Третья строка, если и понадобиться, то только ее часть. А так она там не нужна, равно как и седьмая

Iska, теперь вопрос у меня я написал, какой вид у меня имеется и что я хочу получать. Вид и порядок строк указаны с самого начала. Для успеха получения кода этого хватает.. Следующим вашим вопросом будет - зачем мне буква М и почему нужны строки в таком порядке? Если так, то давайте просто закроем тему, так как она пользы и знаний не принесет ни мне, ни другим участникам форума

Iska 28-08-2013 15:38 2209144

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


eus_deus 28-08-2013 15:43 2209146

Iska, язвить и не думал - задал встречный вопрос. Мне просто казалось, что приведенной информации хватит - имею то-то, хочу получить то-то... Спасибо вам за внимание

Iska, а строки выстроены в вашем примере просто в обратном порядке с удалением третьей и седьмой строки? Я же делал акцент на порядке строк - 5,4,2,1. Спасибо на этом, буду копать в библиотеке работы с массивами. Еще текст добавлять надо все равно

Iska 28-08-2013 16:09 2209157

Цитата:

Цитата eus_deus
Iska, а строки выстроены в вашем примере просто в обратном порядке с удалением третьей и седьмой строки? »

Да. Вы упоминали ещё про седьмую:
Цитата:

Цитата eus_deus
А так она там не нужна, равно как и седьмая »

посему я взял для примера восемь строк. После разбиения строки на подстроки («StringSplit()») нулевой элемент полученного массива содержит количество элементов, потому его удаляем перед обращением порядка элементов массива («_ArrayReverse()»). Удалять лишние/ненужные элементы удобнее с конца.

Цитата:

Цитата eus_deus
Я же делал акцент на порядке строк - 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 2209163

Iska, это уже практически все, что я искал. Функция имее вид
Код:

Func _Convert()
$aS=StringSplit(GUICtrlRead($Edit1),@CRLF,1)
GUICtrlSetData($Edit2, $aS[5] & "#!#" & $aS[4] & "#!#" & $aS[2] & "#!#" & $aS[1])
EndFunc

Осталось к результату спереди добавить текст и сделать выборку части третьей строки, может понадобиться. Но в целом - вопрос решен

Iska 28-08-2013 16:33 2209173

Свистите, если что ;).

eus_deus 28-08-2013 19:14 2209247

Iska, хорошо. В принципе могу уже свистеть.
Строка
Код:

GUICtrlSetData($Edit2, $aS[5] & "#!#" & $aS[4] & "#!#" & $aS[2] & "#!#" & $aS[1])
содержит пробелы. Как от них избавиться в конечном результате? Кстати, если сильно надоедаю, то разрешаю меня послать)))) Я с autoit знаком три дня, хочу научится, а для этого надо решать задачу, к которой есть личный интерес, а не писать скрипты "Привет мир".
И касательно третьей строки... Посмотрел - надо все таки вытягивать с нее часть.
Вид у нее такой
Код:

my_icons.dll,101
Вот тот номер после запятой мне и нужен.В данном случае 101. Предполагаю, что нужна работа с регулярными выражениями. С связи с этим еще вопрос - у кого есть утилита regexp для работы с ними? А то с сайта ее скачать не могу - страница не открывается

madmasles 28-08-2013 19:33 2209254

eus_deus,
Код:

$sString = 'строка с пробелами' & @TAB & ' и еще одна ' & @CR & @LF & 'и еще строка '
ConsoleWrite('До: >' & $sString & '<' & @LF)
$sString = StringStripWS($sString, 8)
ConsoleWrite('После: >' & $sString & '<' & @LF)
ConsoleWrite('---' & @LF)
$sString = 'Мне нужно только то, что после последней запятой, и до конца строки,123'
$sString = StringRegExpReplace($sString, '^.*,', '')
ConsoleWrite($sString & @LF)


eus_deus 28-08-2013 19:42 2209259

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 2209273

eus_deus,
Код:

Local $sString = '', $sDelim = '#!#'
For $i = 1 To 5
    $sString &= ' String ' & $i & ' ' & $sDelim
Next
ConsoleWrite($sString & @LF)

$sString = StringRegExpReplace($sString, $sDelim & '$', '')
ConsoleWrite($sString & @LF)
$sString = StringStripWS($sString, 8)
ConsoleWrite($sString & @LF)

Или
Код:

Local $sString = '', $sDelim = '#!#'
For $i = 1 To 5
    $sString &= ' String ' & $i & ' ' & $sDelim
Next
ConsoleWrite($sString & @LF)
$sString = StringRegExpReplace($sString, $sDelim & '$|\s+', '')
ConsoleWrite($sString & @LF)


Iska 28-08-2013 20:34 2209281

Цитата:

Цитата eus_deus
Кстати, если сильно надоедаю, то разрешаю меня послать)))) »

С чего бы это ;)? Форум для того и создан, чтобы «надоедали», повышая квалификацию.


По остальному решение изложил коллега madmasles.

madmasles, только сейчас заметил, что теперь ссылки ведут на перевод документации на русскоязычном сообществе.

eus_deus 28-08-2013 20:36 2209283

Iska, да, я уже пытаюсь вникнуть в коды коллеги madmasles'a. Правда, боюсь, пока они для меня слишком сложны, но я стараюсь понять))

madmasles 28-08-2013 20:53 2209289

Цитата:

Цитата Iska
теперь ссылки ведут на перевод документации на русскоязычном сообществе. »

Давно уже так.
Цитата:

Цитата eus_deus
они для меня слишком сложны, но я стараюсь понять »

Если что-то непонятно, спрашивайте.

eus_deus 28-08-2013 20:55 2209291

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


Iska 28-08-2013 21:05 2209296

Цитата:

Цитата madmasles
Давно уже так. »

Год-два? Разве это давно?! ;)

madmasles 28-08-2013 21:20 2209307

Цитата:

Цитата eus_deus
ругается при работе на строку »

У Вас нет переменной $Result2
Цитата:

Цитата Iska
Год-два? Разве это давно?! »

Для меня давно то, даты появления чего я уже не помню. :)

eus_deus 28-08-2013 21:22 2209309

madmasles, мать моя женщина! Букву пропустил! Это наверное время позднее, надо заканчивать это дело!
Да, так ошибки нет, но и ожидаемого результата тоже

madmasles 28-08-2013 21:45 2209320

eus_deus,
Можно примерно так.
Код:

_Convert();($Edit1)

Func _Convert();($n_CtrlID)
    Local $s_Read, $a_Split, $s_Ico, $s_Delim = '#!#', $s_NewString = 'M '

    ;$s_Read = GUICtrlRead($n_CtrlID)
    $s_Read = 'String 1' & @CRLF & 'String 2' & @CRLF & 'String 3' & @CRLF & 'String 4,12345' & @CRLF & 'String 5' & @CRLF & 'String 6'
    $a_Split = StringSplit($s_Read, @CRLF, 1)
    If $a_Split[0] < 5 Then Return
    $s_Ico = StringRegExpReplace($a_Split[4], '^.*,', '')
    $s_NewString &= StringRegExpReplace($a_Split[5] & $s_Delim & $s_Ico & $s_Delim & $a_Split[2] & $s_Delim & $a_Split[3], $s_Delim & '$|\s+', '')
    ConsoleWrite($s_NewString & @LF)
    ;GUICtrlSetData($n_CtrlID, $s_NewString)
EndFunc  ;==>_Convert


eus_deus 28-08-2013 22:06 2209335

Вот так после правки. Работает
HTML код:

Func _Convert()
    Local $s_Read, $s_Ico, $s_Delim = '#!#', $s_NewString = 'M '
    $s_Read =StringSplit(GUICtrlRead($Edit1),@CRLF,1)
    If $s_Read[0] < 5 Then Return
    $s_Ico = StringRegExpReplace($s_Read[4], '^.*,', '')
    $s_NewString &= StringRegExpReplace($s_Read[5] & $s_Delim & $s_Ico & $s_Delim & $s_Read[2] & $s_Delim & $s_Read[3], $s_Delim & '$|\s+', '')
    ConsoleWrite($s_NewString & @LF)
    GUICtrlSetData($Edit2, $s_NewString)
EndFunc

Хотя опять наткнулся на камень под водой. В строке, обозначеной переменной $sRead[5] не надо удалять пробелы, так как это подсказка, но в то же время последнее слово подсказки должно писаться слитно с остальной строкой. Пример после работы функции
HTML код:

M Открытьвыделенныефайлы\папкивAIMP3#!#387#!#Programs\Players\AIMP3\AIMP3.exe#!#%P%S
а надо получить
HTML код:

M Открыть выделенные файлы\папки в AIMP3#!#387#!#Programs\Players\AIMP3\AIMP3.exe#!#%P%S

madmasles 28-08-2013 22:38 2209354

Код:

$s_NewString &= $a_Split[5] & $s_Delim & StringRegExpReplace($s_Ico & $s_Delim & $a_Split[2] & $s_Delim & $a_Split[3], $s_Delim & '$|\s+', '')

eus_deus 28-08-2013 22:42 2209358

madmasles, все таки учусь)) был на правильном пути - пробовал так
Код:

    GUICtrlSetData($Edit2, $sRead[5] & $s_NewString)
а надо было то же, но не в ту строку))

madmasles, в этой функции все. Теперь начну чудить форму для других параметров открытия и записи этих строк в файл. Но это уже совсем другая история. Тему считаю закрытой. Будут другие вопросы, другие темы


Время: 14:54.

Время: 14:54.
© OSzone.net 2001-