[архив - Часть 2] AutoIt скрипты

Ответить
 • Просмотры: 29
Аватара пользователя
Diamond

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Diamond »

Creat0R


Цитата:



Да, но разве @CRLF это не одно и тоже что @CR & @LF? если одно и тоже, тогда зачем проверять ещё и @LF, можно только лишь @CR заменить на @LF, и делить на @LF (ведь в переменной останутся только @LF'ы)...



Теперь у меня началось Изображение - надеюсь это не заразно... Изображение


Цитата:



Почему то первый и последний элемент содержат символы перевода строки



Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.

Всё верно! Изображение
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Альтернатива подобной функции:





Код:

Код: Выделить всё

Func _FileReadToArray($sFilePath)
    ;==============================================
    ; Local Constant/Variable Declaration Section
    ;==============================================
    Local $hFile = FileOpen($sFilePath, 0)
    Local $RetArr[1], $Line, $i=1
        If $hFile = -1 Then Return SetError(1)
        While 1
        $Line = FileReadLine($hFile, $i)
        If @error = -1 Then ExitLoop
        If $Line  "" Then
            ReDim $RetArr[UBound($RetArr)+1]
            $RetArr[UBound($RetArr)-1] = $Line
        EndIf
        $i += 1
    WEnd
    $RetArr[0] = UBound($RetArr)-1
        FileClose($hFile)
    Return $RetArr
EndFunc

Возможно немного(?) медленней, но зато в массив не попадают пустые строки Изображение
Аватара пользователя
Diamond

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Diamond »

Creat0R

Они туда попадают, потому что ты их с самого начала записываешь в текстовой файл. Изображение

Пожалуй возьму эту функцию на вооружение... Но всё таки, мне кажется что я сделал всё правильно...
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

Diamond


Цитата:



Я посмотрел содержимое файла в редакторе "Bred" и... оказалось что полученный массив полностью соответствует текстовому файлу... 6 строк, первая и последняя пустые.



Это я вижу и в Notepad(2 Изображение), но мне кажется в массив не должны попадать пустые строки, и я считал что пустая строка, это и есть сочетание символов @LF и @CR, и что функция StringSplit() должна поделить на элементы которе не будут содержать тот символ на который делим (используя к примеру, в качестве третьего параметра, 1 - использовать все символы разделителя как метку деления, т.е не вносить сами символы в полученные элементы).
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

Dirk Diggler


Цитата:



Как из AutoIt открыть ссылку в дефолтном браузере?





Код:

Код: Выделить всё

ShellExecute("http://forum.oszone.net")
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

amel27


Цитата:



реализация через RegExp:



Хм... попробуй подобный пример:





Код:

Код: Выделить всё

#include 
$TestFileHandle = FileOpen("Test.txt", 2)
FileWrite($TestFileHandle, @CR & "Line1" & @LF & @CR & @LF & @CR & @LF & @CR & "Line2" & @CR & "Line3" & @LF & "Line4" & @CRLF)
FileClose($TestFileHandle)
Dim $Array
_FileReadToArray("Test.txt", $Array)
_ArrayDisplay($Array)
Func _FileReadToArray($sFilePath, ByRef $RetArr)
    Local $hFile = FileOpen($sFilePath, 0)
    If $hFile = -1 Then Return SetError(1)
        $RetArr = StringRegExp(FileRead($hFile), '(?s)(.*?)(?:\n\r|\r\n|[\n\r])', 3)
    $RetArr[0] = UBound($RetArr)-1
        FileClose($hFile)
    Return $RetArr
EndFunc

В массив попадают несколько пустных строк...



Кстати, я проверил скорость выполнения функции - С использованием RegExp, в 5-6 раз быстрее чем используя цикл, но зато при использовании цикла возвращаются только текстовые строки Изображение
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

Creat0R


Цитата:



В массив попадают несколько пустных строк



Все правильно, так и запрограммировано - (@LFCR & @LFCR & @LFCR) это разделитель из двух пустых строк... проблема не в том, что остаются пустые строки (почему бы им не быть?), а в том что этими строками считать... Проигнорировать пустые строки как раз проще:

Код:

Код: Выделить всё

$RetArr = StringRegExp(FileRead($hFile),'(?s)(.*?)[\n\r]+', 3)

ADD: или так:

Код:

Код: Выделить всё

$RetArr = StringRegExp(FileRead($hFile),'([^\n\r]+)', 3)

З.Ы. StringRegExp() возвращает массив без счетчика.. т.е. первый элемент занят!
Аватара пользователя
Diamond

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Diamond »

amel27


Цитата:



Обычно за разделитель считают именно @LF, а все вхождения @CR просто удаляют



Т.е. получается... что функция _FileReadToArray() написана правильно?
Цитата:



- ДА

- НЕТ

- разделители: пары @CRLF/@LFCR и в последнюю очередь одиночные @CR и @LF



Я думал что символы @LFCR не могут сосуществовать вместе, т.е. должна получаться пустая строка...

...Если общего правила не существует - то этот вариант, как мне кажется, наиболее подходит.

-Да
Аватара пользователя
Creat0R

Re: [архив - Часть 2] AutoIt скрипты

Сообщение Creat0R »

amel27


Цитата:



или так:



Вот так лучше, таким образом даже первые пустые строки игнорируются.




Цитата:



StringRegExp() возвращает массив без счетчика.. т.е. первый элемент занят!



Хм... а вот это уже немного досадно... а самой функцией StringRegExp нельзя подвинуть все полученные элементы? пусть даже первый элемент будет содержать пустую строку, его то потом просто можно заменить ($RetArr[0] = Ubound($RetArr)-1).
Аватара пользователя
amel27

Re: [архив - Часть 2] AutoIt скрипты

Сообщение amel27 »

Diamond
Цитата:



Если общего правила не существует



в отличие от никсов текстовый файл, сформировнный в Windows не должен содержать одиночных @LF или @CR, только в паре @CRLF - для таких файлов _FileReadToArray() работает правильно



Creat0R
Цитата:



нельзя подвинуть все полученные элементы?



а оно того стоит?... зачем городить огород, для совместимости?.. не вижу смысла оформлять UDF ради одной строчки кода
Ответить

Вернуться в «AutoIt»