Недавние сообщения

Страницы: 1 ... 8 9 [10]
91
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от CreatoR Отправлен Март 19, 2019, 01:39:12 »
xXx  [?]
Цитировать
Я думаю вы эту функцию придумали в процессе работы над такими проектами как GUIDynamicMenu UDF.
Да, там родилась эта версия (те что в первом сообщений), а первая использовалась в Au3SyntaxHighlighter, там была очень важна скорость обработки. В ней логика совершенно другая, там сначала заменяются цитаты на уникальные строки, а поле разделения строки восстанавливаются.
92
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от CreatoR Отправлен Март 19, 2019, 01:31:21 »
xXx  [?]
Цитировать
А вот это что: '"[(|)]"'
Всё что до | это открывающие кавычки, после - закрывающие.

Цитировать
Может быть и так
Это неправильное использование, мы же не можем всё за пользователя делать, такая конструкция неверна.

Цитировать
Дело не в этом
Ну для моих целей это важно, я это использую для обработки большого количества таких строк.

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

В любом случае идеального варианта не подобрать, у каждого свои предпочтения, мы дали людям варианты, а уж они пусть выбирают что использовать :).
93
Общие вопросы по AutoIt / Re: Как записать строку в файл? скрытый
« Последний ответ от CreatoR Отправлен Март 19, 2019, 01:25:18 »
Создал тикет.
94
Общие вопросы по AutoIt / Re: Как записать строку в файл? скрытый
« Последний ответ от CreatoR Отправлен Март 19, 2019, 01:13:17 »
Fier  [?]
Цитировать
для скрытого файла она не работает
Да, они забыли это добавить в описание функции. Это ограничение в FileOpen в режиме записи, а вот в её описании это уже упоминается.
95
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от xXx Отправлен Март 19, 2019, 01:07:47 »
... Там кавычки нужно указывать в последовательности от обратного: '"[(|)]"'
Вот тут не понял. Прошу прощения, был невнимателен. Исправил пост.

... это указано как кавычка, значит всё что после должно интерпретироваться как содержимое в кавычках, до закрывающей кавычки.
Эта строка сборище возможных ляпов юзеров. Вот так:
Код: AutoIt [Выделить]
$sTest = 'Item, "Name), Title, ''Param, other param '' ,$\[-rrr"rrrr"rr-]\, (Quoted, using round brackets), Icon",,,'

это будет уже закрывающая кавычка.


Добавлено: Март 19, 2019, 01:12:50
... а что должно быть?
Предлагаю добавить в описание, что может и @error выскочить.

... ведь не может быть пары кавычки внутри этой самой кавычки.
Может быть и так:
Код: AutoIt [Выделить]
$sTest = 'Item, "Name "New""'



Добавлено: Март 19, 2019, 01:17:54
... значительно быстрее):
Дело тут даже не в этом, а в том что концепция ее работы отличается от вашей.
OffTopicЯ думаю вы эту функцию придумали в процессе работы над такими проектами как GUIDynamicMenu UDF.
Мне тоже довелось недавно придумывать нечто, что стыковало бы файл настроек со скриптом и там тоже было меню и тоже в одну строку.
Вот сейчас сижу и думаю: а правильную ли я логику выбрал чтобы парсить такие строки?
100 процентную защиту от "дурака" придумать не возможно, но нужно стремиться к этому.
96
Дни рождения / С днём рождения real_sm!
« Последний ответ от Представитель Сообщества Отправлен Март 19, 2019, 01:00:43 »
От имени всего Русского сообщества AutoIt поздравляем Вас real_sm с днём рождения!


Нажмите для отображения изображения в оригинальном размере.

Цитировать
Пусть все мечты исполнятся,
Пусть все желанья сбудутся,
Пусть радости запомнятся,
А горести забудутся.

Здоровье будет крепкое,
В делах всегда согласие,
Любовь навеки верная —
Без ссор и разногласия.

Зарплата только вовремя,
Стабильная, высокая.
Работа будет лёгкая
И не совсем далёкая.

Пусть жизнь Вам дарит самые
Прекрасные мгновения.
Желаем только радости
И счастья, с днем рождения!
97
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от CreatoR Отправлен Март 19, 2019, 00:51:33 »
xXx  [?]
Цитировать
Попробую предложить свой вариант:
Сильно не тестировал, вроде неплохо, вот тест сравнения скорости (твоя версия значительно быстрее):

Код: AutoIt [Выделить]
#include <Array.au3>

$sTest = 'My Item, "Name, (Title)", ''Param, [other param]'', [Quoted, using square bracket''s], (...round brackets), <...triangular brackets>, "Icon,Shell32.dll", -2'

_SpeedTest('test_v2_by_CreatoR', 'v2 by CreatoR Test', 10)
_SpeedTest('test_by_xXx', 'by xXx Test', 10)

Func test_v2_by_CreatoR()
    $aRet = _StringSplitOutsideQuotes_v2_by_CreatoR($sTest, ',', False, '''"[(|)]"''')
EndFunc

Func test_by_xXx()
    $aRet = _StringSplitOutsideQuotes_by_xXx($sTest, ',', False, '''|"|()|[]')
EndFunc

Func _SpeedTest($sTestFunc, $sTitle = 'Testing', $iRepeat_Test = 5)
    Local $aTests[$iRepeat_Test + 1] = [$iRepeat_Test]
    Local $iTotal_Tests = 0
   
    ConsoleWrite(StringFormat('+ Tests for "Func %s" (%s) started...\n=--------------------=\n', $sTestFunc, $sTitle))
   
    Local $iDuration_Timer = TimerInit()
   
    For $x = 1 To $iRepeat_Test
        $iTimer = TimerInit()
       
        ;=== CODE TEST ====
        Call($sTestFunc)
        ;=== CODE TEST ===
       
        $aTests[$x] = Round(TimerDiff($iTimer), 3)
        $iTotal_Tests += $aTests[$x]
        ConsoleWrite(StringFormat('- Test #%i: %.2f ms\n', $x, $aTests[$x]))
    Next
   
    Local $iAverage = Round($iTotal_Tests / $iRepeat_Test, 3)
    ConsoleWrite(StringFormat('======================\n! Tests average: %.2f ms\n+ Test Duration: %.2f ms\n\n', $iAverage, TimerDiff($iDuration_Timer)))
EndFunc

#Region ------------ F U N C T I O N S ---------------------------------------------------
Func _StringSplitOutsideQuotes_by_xXx($sString, $sDelim = ',', $bStripQuotes = True, $sQuotes = '', $iFlag = 0) ; Добавлен $iFlag для StringSplit()
    Local $aRet, $aQuotes, $sQuotesL, $sQuotesR, $sPatt, $sRS = Chr(30)
    If Not $sQuotes Then $sQuotes = '"|'''
    If $iFlag Then $iFlag = 2

    Local $aQuotes = StringSplit($sQuotes, '|')
    For $i = 1 To $aQuotes[0]
        $sQuotesL = StringLeft($aQuotes[$i], 1)
        $sQuotesR = StringRight($aQuotes[$i], 1)
        $sPatt &= '(?=\' & $sQuotesL & ').*?\' & $sQuotesR & '|'
    Next

    $sString = StringTrimRight(StringRegExpReplace($sString & $sDelim, _
            '(' & $sPatt & '.*?)\h*(?:' & StringRegExpReplace($sDelim, '([^\w\s])', '\\$1') & '\h*)', '$1' & $sRS), 1)

    $aRet = StringSplit($sString, $sRS, $iFlag)
    If Not @error And $bStripQuotes Then
        For $i = 1 To UBound($aRet) - 1
            For $j = 1 To $aQuotes[0]
                $aRet[$i] = StringRegExpReplace($aRet[$i], '^\' & StringLeft($aQuotes[$j], 1) & '(.*)\' & StringRight($aQuotes[$j], 1) & '$', '$1')
                If @extended Then ContinueLoop 2
            Next
        Next
    EndIf
    Return SetError(@error, 0, $aRet)
EndFunc   ;==>_StringSplitOutsideQuotes_by_xXx

Func _StringSplitOutsideQuotes_v2_by_CreatoR($sString, $sDelim = ',', $fStripQuotes = True, $sQuotes = '"''|''"')
    Local $iPos, $sRes, $iC, $fIsQuote
    Local $aQuotes = StringSplit($sQuotes, '|')
    Local $iQLen = StringLen($aQuotes[1])

    If $aQuotes[0] < 2 Or $iQLen <> StringLen($aQuotes[2]) Then
        Return SetError(1, 0, 0)
    EndIf

    Local $aSplit = StringSplit($sString, '')
    Local $aRet[$aSplit[0]]

    For $i = 1 To $aSplit[0]
        If Not $fIsQuote Then
            $iPos = StringInStr($aQuotes[1], $aSplit[$i], 2)

            If $iPos Then
                $fIsQuote = True
                $sRes &= (Not $fStripQuotes ? $aSplit[$i] : '')
                ContinueLoop
            EndIf
        EndIf

        If $i = $aSplit[0] Or ($aSplit[$i] = $sDelim And Not $fIsQuote) Then
            $iC += 1
            $aRet[$iC] = StringStripWS($sRes & (($i = $aSplit[0] And $aSplit[$i] <> $sDelim) ? $aSplit[$i] : ''), 3)
            $sRes = ''

            If $i = $aSplit[0] And $aSplit[$i] = $sDelim Then
                $iC += 1
                $aRet[$iC] = ''
            EndIf
        Else
            If $fIsQuote Then
                If (($iQLen + 1 - StringInStr($aQuotes[2], $aSplit[$i], 2)) = $iPos) Then
                    $fIsQuote = False

                    If $fStripQuotes Then
                        ContinueLoop
                    EndIf
                EndIf
            EndIf

            $sRes &= $aSplit[$i]
        EndIf
    Next

    $aRet[0] = $iC
    ReDim $aRet[$iC + 1]

    Return $aRet
EndFunc   ;==>_StringSplitOutsideQuotes_v2_by_CreatoR
#EndRegion ------------ F U N C T I O N S ---------------------------------------------------
 

98
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от CreatoR Отправлен Март 19, 2019, 00:41:52 »
xXx  [?]
Цитировать
Попробуйте в параметр $sQuotes подставить пустую строку
Ну всё верно, ничего не вернёт, а что должно быть?

Цитировать
Попробуйте в качестве разделителя $sDelim использовать какие-нибудь другие знаки
Нужно просто дописать в описание функции что нельзя использовать в качестве разделителя тот же символ что указан в качестве кавычки.
Это и логично, ведь не может быть пары кавычки внутри этой самой кавычки.
99
Проблема оказалась в самой NomadMemory.au3. Спустя 3 дня нашел таки похожую ситуацию в топике ниже.
http://autoit-script.ru/index.php?topic=24765.0#msg140675
----------
P.S Надеялся на помощь местных "гуру", а получил от такого же новичка. Понятно почему форум умирает
100
Полезняшки / Re: StringSplitOutsideQuotes - Деление строки на части не учитывая кавычек
« Последний ответ от CreatoR Отправлен Март 19, 2019, 00:33:51 »
xXx
Версия №2 у тебя неверное использование. Там кавычки нужно указывать в последовательности от обратного: '"[(|)]"'

Icon",,, вообще неправильно, это указано как кавычка, значит всё что после должно интерпретироваться как содержимое в кавычках, до закрывающей кавычки.
Страницы: 1 ... 8 9 [10]