Что нового

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

roman82101

Новичок
Сообщения
13
Репутация
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

Продвинутый
Сообщения
268
Репутация
69
Может это?
Код:
#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

Продвинутый
Сообщения
268
Репутация
69
я подсчитывал количество строк чтобы копировать файлы нужное количество раз
Об этом вы не говорили, а в коде это явно не прослеживается
Код:
#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

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

Norm

Продвинутый
Сообщения
268
Репутация
69
Как я понял, Вы хотите наверное читать из $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

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

Oki

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

Khaibit

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

Khaibit

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

Oki

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

Вот так, чтобы быть поближе к скрипту топикстартера.
Код:
$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
Я сразу и не найдусь, что тебя послать читать.
 
Последнее редактирование:
Верх