Что нового

Cкрипт для открытия ссылок из txt файла1 и переноса в txt файл2

Genics

Новичок
Сообщения
39
Репутация
0
Версия AutoIt: v3.3.10.2
Примечание: Операционная система: Microsoft Windows 7 Max Service Pack 1 x64

Описание:
Всем привет

Имеется первый TXT файл с ссылками Файл_1.txt, и второй TXT файл Файл_2.txt. (Файлы вложены)
Нужна программа работающая по следующему алгоритму:
После запуска скрипта открывается окно формы следующего вида
Окно_формы.png

Код формы:
Код:
#include <ButtonConstants.au3>
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>

#Region ### START Koda GUI section ###
$Form1 = GUICreate("Form1", 353, 145, 192, 114)
$Label1 = GUICtrlCreateLabel("Колич. строк", 88, 16, 69, 17)
$Label2 = GUICtrlCreateLabel("Случайный выбор", 176, 16, 94, 17)
$Label3 = GUICtrlCreateLabel("100000", 80, 40, 82, 33) ; 100000 дано для примера отображения в форме! Количество строк беруться из Файла 1
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
$Label4 = GUICtrlCreateLabel("24746", 184, 40, 82, 33) ; 24746 дано для примера отображения в форме! Номер строки для выбора генерирует ГСЧ
GUICtrlSetFont(-1, 18, 400, 0, "MS Sans Serif")
$Button1 = GUICtrlCreateButton("Файл 1", 8, 40, 60, 30)
$Button2 = GUICtrlCreateButton("Файл 2", 280, 40, 60, 30)
$Button3 = GUICtrlCreateButton("Button3", 104, 88, 137, 41)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            Exit

    EndSwitch
WEnd


При нажатии на кнопку “Файл 1” открывается FileOpenDialog где можно выбрать файл. В данном случае это Файл_1.
При нажатии на кнопку “Файл 2” то же самое, но выбираем Файл_2.
1) При нажатии на кнопку “Button3” программа определяет количество строк в Файл_1.
2) Далее генератором случайных чисел получаем число от ( 1) до (количества строк в Файл_1).
3) Используя полученный номер читаем строку с этим номером и открываем её в браузере (который настроен для запуска по умолчанию, у меня Chrome).
4) Записываем использованную ссылку (строку) в Файл_2. Записывать построчно!
5) Удаляем полностью строку с данной ссылкой из Файл_1.

При повторном нажатии на кнопку “Button3” всё повторяется с 1) по 5).
Соответственно в Файл_1 количество строк сойдёт на 0. А в Файл_2 будет заполняться использованными ссылками каждый раз при использовании Файл_2.
 

Вложения

  • Файлы.zip
    909 байт · Просмотры: 4
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstantsEx.au3>
#include <StaticConstants.au3>
#include <EditConstants.au3>
#include <ButtonConstants.au3>
#include <FontConstants.au3>
#include <ColorConstants.au3>
#include <AutoItConstants.au3>
#include <File.au3>

Global Const $SCRIPT_INI = StringLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, ".", 0, -1) - 1) & ".ini"
Global $g_hGUI, $g_idLblCnt, $g_idLblRnd, _
        $g_idInpIn, $g_idInpOut

Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
$g_hGUI = GUICreate(@ScriptName, 400, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, _Exit)

GUICtrlCreateButton("Файл 1:", 5, 10, 60, 25)
GUICtrlSetOnEvent(-1, _SetFileIn)
$g_idInpIn = GUICtrlCreateInput(IniRead($SCRIPT_INI, "History", "In", ""), 70, 12, 325, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
GUICtrlCreateButton("Файл 2:", 5, 40, 60, 25)
GUICtrlSetOnEvent(-1, _SetFileOut)
$g_idInpOut = GUICtrlCreateInput(IniRead($SCRIPT_INI, "History", "Out", ""), 70, 42, 325, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))

GUICtrlCreateLabel("", 0, 75, 400, 70)
GUICtrlSetBkColor(-1, $COLOR_WHITE)

GUICtrlCreateLabel("Количество строк", 0, 85, 200, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$g_idLblCnt = GUICtrlCreateLabel(_FileCountLines(GUICtrlRead($g_idInpIn)), 0, 105, 200, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 18)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUICtrlCreateLabel("Случайный набор", 200, 85, 200, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$g_idLblRnd = GUICtrlCreateLabel("-", 200, 105, 200, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 18)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUICtrlCreateButton("Открыть", 150, 155, 100, 35, $BS_DEFPUSHBUTTON)
GUICtrlSetOnEvent(-1, _OpenUrl)

GUICtrlCreateCheckbox("Закрепить", 330, 160, 65, 25, $BS_PUSHLIKE)
GUICtrlSetTip(-1, "Поверх всех окон")
GUICtrlSetOnEvent(-1, _PinToTop)
GUISetState()
If Int(IniRead($SCRIPT_INI, "History", "Pin", "0")) Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    WinSetOnTop($g_hGUI, "", $WINDOWS_ONTOP)
EndIf

While Sleep(10)
WEnd

Func _SetFileIn()
    Local $sFile = FileOpenDialog("", @ScriptDir, "Текстовые документы (*.txt)|Все (*.*)", $FD_FILEMUSTEXIST, GUICtrlRead($g_idInpIn), $g_hGUI)
    If @error Then Return

    GUICtrlSetData($g_idLblCnt, _FileCountLines($sFile))
    GUICtrlSetData($g_idInpIn, $sFile)
    IniWrite($SCRIPT_INI, "History", "In", $sFile)
EndFunc   ;==>_SetFileIn

Func _SetFileOut()
    Local $sFile = FileOpenDialog("", @ScriptDir, "Текстовые документы (*.txt)|Все (*.*)", 0, GUICtrlRead($g_idInpOut), $g_hGUI)
    If @error Then Return

    GUICtrlSetData($g_idInpOut, $sFile)
    IniWrite($SCRIPT_INI, "History", "Out", $sFile)
EndFunc   ;==>_SetFileOut

Func _OpenUrl()
    Local $sFileIn = GUICtrlRead($g_idInpIn)
    If Not $sFileIn Then Return MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, 'Выберите "Файл 1".', 0, $g_hGUI)

    Local $sFileOut = GUICtrlRead($g_idInpOut)
    If Not $sFileOut Then Return MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, 'Выберите "Файл 2".', 0, $g_hGUI)

    Local $aURLs = FileReadToArray($sFileIn), $iCount = @extended
    If @error Then Return MsgBox($MB_TOPMOST + $MB_ICONERROR, Default, (@error = 2) ? '"Файл 1" пуст.' : 'Не удалось открыть "Файл 1".', 0, $g_hGUI)

    Local $iIdx = Random(0, $iCount - 1, 1)
    GUICtrlSetData($g_idLblRnd, $iIdx + 1)

    ShellExecute($aURLs[$iIdx])
    FileWriteLine($sFileOut, $aURLs[$iIdx])
    $iCount = _ArrayDelete($aURLs, $iIdx)
    GUICtrlSetData($g_idLblCnt, $iCount)
    If Not $iCount Then Return FileClose(FileOpen($sFileIn, $FO_OVERWRITE))
    _FileWriteFromArray($sFileIn, $aURLs)
EndFunc   ;==>_OpenUrl

Func _PinToTop()
    Local $iPin = Int(BitAND(GUICtrlRead(@GUI_CtrlId), $GUI_CHECKED) = $GUI_CHECKED)
    WinSetOnTop($g_hGUI, "", $iPin)
    IniWrite($SCRIPT_INI, "History", "Pin", $iPin)
EndFunc   ;==>_PinToTop

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Genics, здравствуйте!
Если отвлечься от факта, что Tempo предложил классный вариант, к Вам есть пара вопросов по сути:
1. Как поступить с файлом-источником, к-рый в Вашей терминологии «Файл_1»: оставить нетронутым/перезаписать пустышкой/удалить вообще?
Подозреваю, что оставить как было, но экстрасенс из меня никакой…
2. Касаемо файла-получателя («Файл_2»), тут две половых разницы: добавить в хвост новые обработанные ссылки, или перезаписать его заново?
Ну а по мелочам — уточните, что и как, работающий («в принципе» ©) вариант (конечно не такой навороченный) есть… :drinks:
Сообщение автоматически объединено:

UPD: сабж-то забыл приложить
В архиве исходник + рез-т работы после + протокол выборки/записи
 

Вложения

  • Forum4-v1.zip
    6.8 КБ · Просмотры: 6
Последнее редактирование:
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
Благодарю тебя Tempo! :smile:

Всё работает правильно кроме того что:
1) Не работает случайная выборка строк из Файл_1. При нажатии на кнопку "Открыть" каждый раз открывает первую строку. А мне надо генератор случайных чисел

2) Если в Файл_1 между строк с ссылками есть пустая строка то программа ее тоже переносит в Файл_2, а этого делать не надо. Надо просто пропустить её ( т. е. пустую строку) и открыть следующую ссылку, конечно не забыть перенести её в Файл_2.
Сообщение автоматически объединено:

Здравствуйте Alecsis!

Хотел потестить ваш вариант но не нашел библиотеки avLib.au3. Поэтому ещё не тестил. Если можно скиньте пожалуйста файл библиотеки.

Ответы на вопросы:
1) При каждом нажатии на кнопку, в Файл_1 количество строк уменьшается на 1 до нуля, и файл остаётся пустым (Но "теоретически" если в нём НОЛЬ строк его можно и удалить. Он ведь больше не нужен).
Т. е. если у нас в начале допустим 70 строк, Нажимаем кнопку остаётся 69, ещё нажимаем 68 и т. д. до нуля. Tempo так и реализовал

2)
Да надо добавить в хвост новые обработанные ссылки, до бесконечности ( на сколько это возможно) .
 
Последнее редактирование:

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Благодарю тебя Tempo! :smile:

Всё работает правильно кроме того что:
1) Не работает случайная выборка строк из Файл_1. При нажатии на кнопку "Открыть" каждый раз открывает первую строку. А мне надо генератор случайных чисел

2) Если в Файл_1 между строк с ссылками есть пустая строка то программа ее тоже переносит в Файл_2, а этого делать не надо. Надо просто пропустить её ( т. е. пустую строку) и открыть следующую ссылку, конечно не забыть перенести её в Файл_2.

1) Индекс выбранной строки генерируется случайным образом и отображается в поле "Случайный набор". Вы уверенны что при нажатии на кнопку "Открыть" каждый раз открывает первую строку? Ибо я не могу воспроизвести вашу проблему

2) Можно ли удалять из файла строки которые не являются ссылками? Или их обязательно именно пропустить?
 
Автор
G

Genics

Новичок
Сообщения
39
Репутация
0
1) Индекс выбранной строки генерируется случайным образом и отображается в поле "Случайный набор". Вы уверенны что при нажатии на кнопку "Открыть" каждый раз открывает первую строку? Ибо я не могу воспроизвести вашу проблему

Я перепроверил ещё раз используя ваш код и те файлы которые я вкладывал в архиве
Да всё верно, у меня каждый раз при нажатии на КН "Открыть" берёт первую ссылку (первую строку)
И в окне формы где отображает "случайный выбор" всегда стоит 1.

2) Да в Файл_1 можно удалять все строки без ссылок. Всё равно со временем он опустеет и в нем не должно остаться строк
 

Tempo

AutoIT Гуру
Сообщения
616
Репутация
205
Я перепроверил ещё раз используя ваш код и те файлы которые я вкладывал в архиве
Да всё верно, у меня каждый раз при нажатии на КН "Открыть" берёт первую ссылку (первую строку)
И в окне формы где отображает "случайный выбор" всегда стоит 1.
Версия AutoIt: v3.3.10.2
Проблема в том что вы используете устаревшую версию AutoIt. Скрипт был написан под 3.3.14.5 (это указано в скрипте)
Сообщение автоматически объединено:

Для корректной работы, обновите AutoIt
Код:
;~ AutoIt Version: 3.3.14.5
#include <GUIConstants.au3>
#include <ColorConstants.au3>
#include <WinAPIShPath.au3>
#include <GuiEdit.au3>
#include <File.au3>

Global Const $SCRIPT_INI = StringLeft(@ScriptFullPath, StringInStr(@ScriptFullPath, ".", 0, -1) - 1) & ".ini"
Global $g_hGUI, $g_idLblCnt, $g_idLblRnd, _
        $g_idInpIn, $g_idInpOut

Opt("GUIOnEventMode", 1)
Opt("TrayAutoPause", 0)
$g_hGUI = GUICreate(@ScriptName, 400, 200)
GUISetOnEvent($GUI_EVENT_CLOSE, _Exit)

GUICtrlCreateButton("Файл 1:", 5, 10, 60, 25)
GUICtrlSetOnEvent(-1, _SetFileIn)
$g_idInpIn = GUICtrlCreateInput(IniRead($SCRIPT_INI, "History", "In", ""), 70, 12, 325, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))
GUICtrlCreateButton("Файл 2:", 5, 40, 60, 25)
GUICtrlSetOnEvent(-1, _SetFileOut)
$g_idInpOut = GUICtrlCreateInput(IniRead($SCRIPT_INI, "History", "Out", ""), 70, 42, 325, 21, BitOR($GUI_SS_DEFAULT_INPUT, $ES_READONLY))

GUICtrlCreateLabel("", 0, 75, 400, 70)
GUICtrlSetBkColor(-1, $COLOR_WHITE)

GUICtrlCreateLabel("Количество строк", 0, 85, 200, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$g_idLblCnt = GUICtrlCreateLabel(_FileCountLines(GUICtrlRead($g_idInpIn)), 0, 105, 200, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 18)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUICtrlCreateLabel("Случайный набор", 200, 85, 200, 20, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)
$g_idLblRnd = GUICtrlCreateLabel("-", 200, 105, 200, 30, BitOR($SS_CENTER, $SS_CENTERIMAGE))
GUICtrlSetFont(-1, 18)
GUICtrlSetBkColor(-1, $GUI_BKCOLOR_TRANSPARENT)

GUICtrlCreateButton("Открыть", 150, 155, 100, 35, $BS_DEFPUSHBUTTON)
GUICtrlSetOnEvent(-1, _OpenUrl)

GUICtrlCreateCheckbox("Закрепить", 330, 160, 65, 25, $BS_PUSHLIKE)
GUICtrlSetTip(-1, "Поверх всех окон")
GUICtrlSetOnEvent(-1, _PinToTop)
GUISetState()
If Int(IniRead($SCRIPT_INI, "History", "Pin", "0")) Then
    GUICtrlSetState(-1, $GUI_CHECKED)
    WinSetOnTop($g_hGUI, "", $WINDOWS_ONTOP)
EndIf

While Sleep(10)
WEnd

Func _SetFileIn()
    Local $sFile = FileOpenDialog("", @ScriptDir, "Текстовые документы (*.txt)|Все (*.*)", $FD_FILEMUSTEXIST, GUICtrlRead($g_idInpIn), $g_hGUI)
    If @error Then Return

    GUICtrlSetData($g_idLblRnd, "-")
    GUICtrlSetData($g_idLblCnt, _FileCountLines($sFile))
    GUICtrlSetData($g_idInpIn, $sFile)
    IniWrite($SCRIPT_INI, "History", "In", $sFile)
EndFunc   ;==>_SetFileIn

Func _SetFileOut()
    Local $sFile = FileOpenDialog("", @ScriptDir, "Текстовые документы (*.txt)|Все (*.*)", 0, GUICtrlRead($g_idInpOut), $g_hGUI)
    If @error Then Return

    GUICtrlSetData($g_idInpOut, $sFile)
    IniWrite($SCRIPT_INI, "History", "Out", $sFile)
EndFunc   ;==>_SetFileOut

Func _OpenUrl()
    GUICtrlSetData($g_idLblRnd, "-")
    Local $sFileIn = GUICtrlRead($g_idInpIn)
    If Not $sFileIn Then Return _GUICtrlEdit_ShowBalloonTip($g_idInpIn, "Ошибка", "Выберите файл.", $TTI_ERROR)

    Local $sFileOut = GUICtrlRead($g_idInpOut)
    If Not $sFileOut Then Return _GUICtrlEdit_ShowBalloonTip($g_idInpOut, "Ошибка", "Выберите файл.", $TTI_ERROR)

    Local $aURLs = FileReadToArray($sFileIn), $iCount = @extended
    If @error Then Return _GUICtrlEdit_ShowBalloonTip($g_idInpIn, "Ошибка", (@error = 2) ? "Файл пуст." : "Не удалось открыть файл.", $TTI_ERROR)

    Local $iIdx, $sURL, $hFileIn = FileOpen($sFileIn, $FO_OVERWRITE)
    Do
        If Not $iCount Then Return FileClose($hFileIn) + _GUICtrlEdit_ShowBalloonTip($g_idInpIn, "Ошибка", "Ссылки не найдены.", $TTI_ERROR)
        $iIdx = Random(0, $iCount - 1, 1)
        $sURL = $aURLs[$iIdx]
        $iCount = _ArrayDelete($aURLs, $iIdx)
        GUICtrlSetData($g_idLblCnt, $iCount)
    Until _WinAPI_UrlIs($sURL)

    GUICtrlSetData($g_idLblRnd, $iIdx + 1)
    ShellExecute($sURL)
    FileWriteLine($sFileOut, $sURL)
    _FileWriteFromArray($hFileIn, $aURLs)
    FileClose($hFileIn)
EndFunc   ;==>_OpenUrl

Func _PinToTop()
    Local $iPin = Int(BitAND(GUICtrlRead(@GUI_CtrlId), $GUI_CHECKED) = $GUI_CHECKED)
    WinSetOnTop($g_hGUI, "", $iPin)
    IniWrite($SCRIPT_INI, "History", "Pin", $iPin)
EndFunc   ;==>_PinToTop

Func _Exit()
    Exit
EndFunc   ;==>_Exit
 
Последнее редактирование:

Alecsis

Осваивающий
Сообщения
101
Репутация
41
Хотел потестить ваш вариант но не нашел библиотеки avLib.au3. Поэтому ещё не тестил. Если можно скиньте пожалуйста файл библиотеки.
Привет!
1. Каюсь, забыл закомментить
Код:
#include avLib.au3

Это были мои извраты, в данном случае — исключительно для отладки, всё будет работать и без того.
2. Ну хоть понятно, как поступать с «файл1» и «файл2»
Сообщение автоматически объединено:

Подправленный вариант, без левых «#include»,
и в основном диалоге отслеживается, сколько строк осталось обработать.
«Левые» строки (к-рые формально не похожи на ссылки), не обрабатываются.
Остались, к.м.к., детали типа перезаписи исходного «файл-1», что можно/нельзя пихать в файл-адресат итп.

PS если уж лезть «поглубже»… главно окно я бы сделал в стиле Tempo (вот только «чукча не художник…» и здесь не полезу что-то предлагать)
и есть соображения заблокировать кнопки «Файл-1» и «Файл-2» на время обработки уже выбранного контента.
Что называется, «во избежание»…
 

Вложения

  • Forum4-v2.zip
    5.1 КБ · Просмотры: 3
Последнее редактирование:
Верх