Что нового

Данные, строки Аналог FileReadLine

roman82101

Новичок
Сообщения
8
Репутация
0
Приветствую, достал старый скрипт и решил не много переделать, всё шло не плохо пока не наткнулся на одну строчку. Дело в том что раньше скрипт работал с файлом, теперь его нет и всё делается в окне. Через поиск ничего не нашёл, либо не понял как реализовать у себя, вот сам скрипт
Код:
#include <EditConstants.au3>
#include <Clipboard.au3>

$s = _Input("test")
Func _Input($Title = "")
   Local $GUI = GUICreate($Title, 1000, 760)
   Local $Input = GUICtrlCreateInput('', 10, 110, 980, 605, $ES_MULTILINE + $ES_WANTRETURN)
   Local $BtnSort = GUICtrlCreateButton("Отсортировать", 280, 725, 150)
   Local $BtnSave = GUICtrlCreateButton("Сохранить", 460, 725, 300)
   Local $BtnCancel = GUICtrlCreateButton("Выход", 890, 725, 100)
   GUISetState()
Do
   Switch GUIGetMsg()
   Case -3, $BtnCancel
      Return SetError(1, GUIDelete($GUI), "")
   Case $BtnSort
      ; бла бла бла и получатется список из 4-хзначных цифр в столбик
      $NumbF = UBound(StringSplit($Input, @CRLF, 1))  ;Посчитать строки
   Case $BtnSave
      $i = 1
      $err = 0
      $dir = StringRegExpReplace(@ScriptDir, '.*\\', '')
      For  $g = 1 To $NumbF
         $rLin = FileReadLine($Input, $i) ; <<<---- так было с файлом, а теперь нужно со списком, буду благодарен за помощь
         $code = 'имя' & $rLin & 'расширение'
         DirCreate(@DesktopDir & '\' & $dir & 'готово')
         If FileExists($code) Then
            FileCopy($code, @DesktopDir & '\' & $dir & 'готово')
            Sleep(500)
         EndIf
            $i = $i + 1
         Next
   EndSwitch
Until 0
EndFunc
 
Решение
Как я понял, Вы хотите наверное читать из $Input "построчно" часть названия файлов, которые (если они существуют) затем копировать в новую папку на десктопе.

Этот скрипт проверяет наличие файлов в директории со скриптом, в названии которых есть значения из строк прочитанные из $Input.
Если такой файл есть, копирует его в новую папку на десктопе.
Код:
#include <EditConstants.au3>
#include <Clipboard.au3>

$s = _Input("test")
Func _Input($Title = "")
   Local $GUI = GUICreate($Title, 1000, 760)
   Local $Input = GUICtrlCreateInput('', 10, 110, 980, 605, $ES_MULTILINE + $ES_WANTRETURN)
   Local $BtnSort = GUICtrlCreateButton("Отсортировать", 280, 725, 150)
   Local $BtnSave = GUICtrlCreateButton("Сохранить", 460, 725, 300)
   Local...

Norm

Осваивающий
Сообщения
133
Репутация
20
Может это?
Код:
#include <EditConstants.au3>
#include <Clipboard.au3>

$s = _Input("test")
Func _Input($Title = "")
   Local $GUI = GUICreate($Title, 1000, 760)
   Local $Input = GUICtrlCreateInput('', 10, 110, 980, 605, $ES_MULTILINE + $ES_WANTRETURN)
   Local $BtnSort = GUICtrlCreateButton("Отсортировать", 280, 725, 150)
   Local $BtnSave = GUICtrlCreateButton("Сохранить", 460, 725, 300)
   Local $BtnCancel = GUICtrlCreateButton("Выход", 890, 725, 100)
   GUISetState()
    Do
       Switch GUIGetMsg()
       Case -3, $BtnCancel
          Return SetError(1, GUIDelete($GUI), "")
       Case $BtnSort
          ; бла бла бла и получатется список из 4-хзначных цифр в столбик
          $NumbF = UBound(StringSplit($Input, @CRLF, 1))  ;Посчитать строки
       Case $BtnSave
          $sString = GUICtrlRead($Input) ; <<<---- так было с файлом, а теперь нужно со списком, буду благодарен за помощь
          If $sString = "" Then
              MsgBox(0,"Ошибка","Текст не найден")
          Else
              $iFile = @DesktopDir & '\Новая папка\Test.txt'
              $hDat = FileOpen($iFile,2+8)
              FileWrite($hDat, $sString)
              FileClose($hDat)
              If FileExists($iFile) Then MsgBox(0,"Результат", "㋡ Данные сохранены")
          EndIf
       EndSwitch
    Until 0
EndFunc
 

Norm

Осваивающий
Сообщения
133
Репутация
20
я подсчитывал количество строк чтобы копировать файлы нужное количество раз
Об этом вы не говорили, а в коде это явно не прослеживается
Код:
#include <EditConstants.au3>
#include <Clipboard.au3>

$s = _Input("test")
Func _Input($Title = "")
   Local $GUI = GUICreate($Title, 1000, 760)
   Local $Input = GUICtrlCreateInput('', 10, 110, 980, 605, $ES_MULTILINE + $ES_WANTRETURN)
   Local $BtnSort = GUICtrlCreateButton("Отсортировать", 280, 725, 150)
   Local $BtnSave = GUICtrlCreateButton("Сохранить", 460, 725, 300)
   Local $BtnCancel = GUICtrlCreateButton("Выход", 890, 725, 100)
   GUISetState()
    Do
       Switch GUIGetMsg()
       Case -3, $BtnCancel
          Return SetError(1, GUIDelete($GUI), "")
       Case $BtnSort
          ; бла бла бла и получатется список из 4-хзначных цифр в столбик
          $NumbF = UBound(StringSplit($Input, @CRLF, 1))  ;Посчитать строки
       Case $BtnSave
          $sString = GUICtrlRead($Input) ; <<<---- так было с файлом, а теперь нужно со списком, буду благодарен за помощь
          If $sString = "" Then
              MsgBox(0,"Ошибка","Текст не найден")
          Else
              $aArr = StringRegExp($sString, "([^\v]+)", 3)
              $nUB = UBound($aArr)
              For $nN = 0 To $nUB-1
                  $iFile = @DesktopDir & '\Новая папка\Test-'& $nN &'.txt'
                  $hDat = FileOpen($iFile,2+8)
                  FileWrite($hDat, $aArr[$nN])
                  FileClose($hDat)
              Next
              If FileExists($iFile) Then MsgBox(0,"Результат", "㋡ Данные сохранены"& @CRLF &"Создано "& $nUB &" файл(а/ов)")
          EndIf
       EndSwitch
    Until 0
EndFunc
 
Последнее редактирование:
Автор
roman82101

roman82101

Новичок
Сообщения
8
Репутация
0
явно не прослеживается
строка для подсчёта строчек (18-ая) даже комментарий имеет, один из не многочисленных. Новые окна и проверки на ошибки не нужны, нужно переписать строчку, одну - "$rLin = FileReadLine($Input, $i)" чтоб считывала строчки по очереди, начиная с первой, из окна $Input (а не файла как раньше), подсчитанное количество раз - $NumbF которое будет меняться в - $i
 

Norm

Осваивающий
Сообщения
133
Репутация
20
Как я понял, Вы хотите наверное читать из $Input "построчно" часть названия файлов, которые (если они существуют) затем копировать в новую папку на десктопе.

Этот скрипт проверяет наличие файлов в директории со скриптом, в названии которых есть значения из строк прочитанные из $Input.
Если такой файл есть, копирует его в новую папку на десктопе.
Код:
#include <EditConstants.au3>
#include <Clipboard.au3>

$s = _Input("test")
Func _Input($Title = "")
   Local $GUI = GUICreate($Title, 1000, 760)
   Local $Input = GUICtrlCreateInput('', 10, 110, 980, 605, $ES_MULTILINE + $ES_WANTRETURN)
   Local $BtnSort = GUICtrlCreateButton("Отсортировать", 280, 725, 150)
   Local $BtnSave = GUICtrlCreateButton("Сохранить", 460, 725, 300)
   Local $BtnCancel = GUICtrlCreateButton("Выход", 890, 725, 100)
   GUISetState()
Do
   Switch GUIGetMsg()
   Case -3, $BtnCancel
      Return SetError(1, GUIDelete($GUI), "")
   Case $BtnSort
      ; бла бла бла и получатется список из 4-хзначных цифр в столбик
      $NumbF = UBound(StringSplit($Input, @CRLF, 1))  ;Посчитать строки
   Case $BtnSave
      $i = 1
      $err = 0
      $dir = StringRegExpReplace(@ScriptDir, '.*\\', '')
      DirCreate(@DesktopDir & '\' & $dir & '_готово')
      $rLin = StringRegExp(GUICtrlRead($Input), "([^\v]+)", 3)
      If @error Then
        MsgBox(0,"Ошибка","Текст не найден")
      Else
        $NumbF = UBound($rLin)
        For $nN = 0 To $NumbF-1
            $code = @ScriptDir &"\"& 'имя_' & $rLin[$nN] & '.txt'
            If FileExists($code) Then
                FileCopy($code, @DesktopDir & '\' & $dir & '_готово')
ConsoleWrite("Copy "& $code & @CRLF)
            Else
ConsoleWrite("No Found "& $code & @CRLF)
            EndIf
        Next
        MsgBox(0,"Результат", "Скопировано "& $NumbF &" файл(а/ов)")
     endif
   EndSwitch
Until 0
EndFunc
 
Последнее редактирование:
Решение
Автор
roman82101

roman82101

Новичок
Сообщения
8
Репутация
0
Вот теперь совсем другое дело, то что нужно и работает, благодарю за помощь
 

Oki

Новичок
Сообщения
61
Репутация
1
Код:
$NumbF = UBound(StringSplit($Input, @CRLF, 1))  ;Посчитать строки
Если я правильно понимаю задачу, то эту строку следует выполнить пошагово.
Код:
$arraySpliteInput = StringSplit($Input, @CRLF, 1) ;Читать строки в массив
$NumbF = UBound($arraySpliteInput)  ;Посчитать строки
Тогда не нужно более ничего считывать, а попросту делать проход по массиву $arraySpliteInput.
 

Khaibit

Знающий
Сообщения
98
Репутация
18
Если я правильно понимаю задачу, то эту строку следует выполнить пошагово.
Тогда не нужно более ничего считывать, а попросту делать проход по массиву
Советую прочитать в справке описание функций UBound и StringSplit
 

Khaibit

Знающий
Сообщения
98
Репутация
18
Если я правильно понимаю задачу, то эту строку следует выполнить пошагово.
Тогда не нужно более ничего считывать, а попросту делать проход по массиву.
Нет абсолютно никакой разницы в одну или две строки это писать. Что там делать "пошагово"? Какой там "проход по массиву"?
Там просто получается размер массива. Иди справку читай.
 

Oki

Новичок
Сообщения
61
Репутация
1
Нет абсолютно никакой разницы в одну или две строки это писать. Что там делать "пошагово"? Какой там "проход по массиву"?
Там просто получается размер массива. Иди справку читай.
Пластинку заело?

Вот так, чтобы быть поближе к скрипту топикстартера.
Код:
$Input = "test1" & @CRLF & "test2" & @CRLF & "test3" & @CRLF & "test4" & @CRLF & "test5" ;Тестовый инпут для демонстрации работы скрипта
$arraySpliteInput = StringSplit($Input, @CRLF, 1) ;Читать строки в массив
$NumbF = UBound($arraySpliteInput)  ;Посчитать строки
$sMsg = ""
For $i = 1 To $NumbF - 1
   $rLin = $arraySpliteInput[$i]
   $code = 'имя' & $rLin & 'расширение'
   $sMsg &= "Здесь можно поставить блок обработки файла с именем " & $code
   MsgBox(262144, "Информационное сообщение", $sMsg, 1)
   $sMsg &= " - Блок успешно обработан" & @CRLF
Next
Или даже лучше с флагом 3 вот так.
Код:
$Input = "test1" & @CRLF & "test2" & @CRLF & "test3" & @CRLF & "test4" & @CRLF & "test5" ;Тестовый инпут для демонстрации работы скрипта
$arraySpliteInput = StringSplit($Input, @CRLF, 3) ;Читать строки в массив
$NumbF = UBound($arraySpliteInput)  ;Посчитать строки
$sMsg = ""
For $i = 0 To $NumbF - 1
   $rLin = $arraySpliteInput[$i]
   $code = 'имя' & $rLin & 'расширение'
   $sMsg &= "Здесь можно поставить блок обработки файла с именем " & $code
   MsgBox(262144, "Информационное сообщение", $sMsg, 1)
   $sMsg &= " - Блок успешно обработан" & @CRLF
Next
Я сразу и не найдусь, что тебя послать читать.
 
Последнее редактирование:
Верх