Что нового

RedneckQuoteSplitter - крошим строку на цитаты

Сообщения
142
Репутация
-3
AutoIt: 3.?.??.?
Версия: 1.0

Категория: Вспомогательные функции, Строки, Данные

Описание: Творит цитаты из имеющейся строки. Берет строку, и делит её по нужному вам знаку (по умолчанию запятая), при этом выдергивает цитаты, не ломая их той же запятой.
Важно! При указании $quotes, не забывайте про парность символов, т.е. если есть (, то должно быть и ).

Код/Пример:
Код:
#Region About

#cs
    Title:          Redneck Quote Splitter v1.0
    Filename:       RedneckQuoteSqplit.au3
    Description:    ---
    Authors:        HH (original)
    Forum Topic:    http://autoit-script.ru/index.php?topic=26702
    Version:        1.00 (17 March 2019)
    Requirements:   AutoIt v3.3 +
    Uses:           None
    Notes:          -

	How to use:

	  1. include, using #include <RedneckQuoteSplit.au3>
	  2. call function by _RedneckQuoteSplit($string, $delimeter, $quote)

#ce

#EndRegion

#include-once
#include <Array.au3>

; Example below, you can delete this
Local $vTest = 'My Item, "Name, or Title", ''Param, other param'', [Quoted, using square brackets], (Quoted, using round brackets), Icon, -2'
;Local $sDelimeter = ','
;Local $sDelimeters = '"''[]()'
Local $aResult = _RedneckQuoteSplit($vTest)
;ConsoleWrite(_ArrayDisplay($aResult))

; Main Function
Func _RedneckQuoteSplit($string, $delimeter = ',', $quotes = '"''[]()')

   $iStringLenght = StringLen($string)

   Local $j = 1
   Local $sResult = ''
   Local $aResult[$iStringLenght/4]
   Local $iQuoteFlag = False

   For $i = 1 to $iStringLenght + 1

	  $sSymbol = String(StringMid($string, $i, 1))

	  If StringInStr($quotes, $sSymbol) Then
		 If $iQuoteFlag == False Then
			$iQuoteFlag = True
		 Else
			$iQuoteFlag = False
		 EndIf
	  EndIf

	  If $sSymbol = $delimeter and $iQuoteFlag == False or $i = $iStringLenght + 1 Then
		 ;ConsoleWrite(@crlf & $j & ' ' & $sResult & @crlf & ' ' & $iQuoteFlag & @crlf)
		 $aResult[$j] = $sResult
		 $sResult = ''
		 $j += 1
	  Else
		 $sResult &= String($sSymbol)
	  EndIf
   Next
   $aResult[0] = $j
   ReDim $aResult[$j]
   Return $aResult
EndFunc

Файл: http://

Снимок:

История версий:

Источник: autoit-script.ru
Автор(ы): ЭйчЭйч
 

CreatoR

Must AutoIt!
Команда форума
Администратор
Сообщения
8,671
Репутация
2,481
Неплохой алгоритм, но есть нюансы...
* Нельзя использовать символы цитирования внутри другого блока цитирования
* Медленно при больших строках
* Возвращает пробелы в начале строки если они есть после разделителя.
* Конструкцию типа If $iQuoteFlag == False Then... можно заменить на $iQuoteFlag = Not $iQuoteFlag.
* String() там вообще не нужна, тип значения и так строка :smile:.
 
Автор
Э
Сообщения
142
Репутация
-3
CreatoR сказал(а):
Неплохой алгоритм, но есть нюансы...
* Нельзя использовать символы цитирования внутри другого блока цитирования
* Медленно при больших строках
* Возвращает пробелы в начале строки если они есть после разделителя.
* Конструкцию типа If $iQuoteFlag == False Then... можно заменить на $iQuoteFlag = Not $iQuoteFlag.
* String() там вообще не нужна, тип значения и так строка :smile:.
1. Я думал об этом, решил сейчас не заморачиваться, так как в варианте "слово, 'слово слово", слово' вообще непонятно как поступать.
2. Судьба такая. :(
3. Специально оставил. Вдруг кому пригодятся. :D Мне пригодились в ConsoleWrite. :D
4. Не знаком с такой конструкцией, посмотрю, что можно поправить.
5. Как атавизм осталось. :whistle: Уже убрал у себя.

Благодарю за замечания. Внесу изменения и обновлю.
 
Верх