1

Тема: AHK: StringSplit и 4-е подряд пробела.

Добрый день.
Скрипт считывает текстовый файл в переменную, а затем пытается разбить на куски с помощью StringSplit.

Delim=%A_Space%+%A_Space%+%A_Space%+%A_Space%
FileRead, ALL, %SourceFile%
StringSplit, StringArr, ALL , %Delim%

Куски текста (числа), отделены либо 4-мя пробелами либо "концом строки" и "переводом каретки". Код выше - не работает т.к. пробелы учитывает поштучно, а не 4-е разом. В результате образуется куча пустых переменных.

Пример считываемого файла:

sec"    "mA"    "mV
3,2452587890625    -0,00311479461379349    0,854992806911469
3,29225610351563    -0,00306393066421151    0,884990870952606

Спасибо.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

2

Re: AHK: StringSplit и 4-е подряд пробела.

text =
(
sec"    "mA"    "mV
3,2452587890625    -0,00311479461379349    0,854992806911469
3,29225610351563    -0,00306393066421151    0,884990870952606
)

s := RegExSplit(text, " {4}|\R")
loop % s.MaxIndex()
    MsgBox % s[A_Index]

RegExSplit(ByRef string, ByRef pattern, ByRef ommit := "") {
    startPos := 1, EntryList := []

    while matchPos := RegExMatch(string, pattern, match, startPos)
        EntryList.Insert(Trim(SubStr(string, startPos, matchPos - startPos), ommit))
        , startPos := matchPos + (IsObject(match)? match.len : StrLen(match))

    EntryList.Insert(Trim(SubStr(string, startPos), ommit))
    return EntryList
}

3

Re: AHK: StringSplit и 4-е подряд пробела.

Спасибо большое.

(в ByRef ommit := "" надо убрать двоеточие. с ним не работает)

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

4

Re: AHK: StringSplit и 4-е подряд пробела.

В ByRef ommit := "" не нужно убрать двоеточие. с ним работает аж с ноября 2012.

1.1.09.00 - November 7, 2012
Allow optional parameters to be declared with := instead of =, for consistency with variable declarations and expressions.

5

Re: AHK: StringSplit и 4-е подряд пробела.

ИЗвиняюсь, у меня 1.1.08. Спасибо. Сейчас обновлюсь.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

6

Re: AHK: StringSplit и 4-е подряд пробела.

Согласно рекомендациям из справки.

text =
(
sec"    "mA"    "mV
3,2452587890625    -0,00311479461379349    0,854992806911469
3,29225610351563    -0,00306393066421151    0,884990870952606
)

StringReplace text, text, % "    ", % Chr(9733), 1
StringReplace text, text, `r`n, % Chr(9733), 1
StringReplace text, text, `n, % Chr(9733), 1

StringSplit StringArr, text, % Chr(9733)
Listvars
Pause

7 (изменено: Mikki, 2013-05-14 21:17:37)

Re: AHK: StringSplit и 4-е подряд пробела.

И еще раз спасибо.

added: гдето на порядок быстрее..или больше.

Жизнь стоит того чтобы не быть сволочью. (с) Разные Люди

8 (изменено: serzh82saratov, 2013-05-16 15:00:36)

Re: AHK: StringSplit и 4-е подряд пробела.

Правильно ли я понял что "Chr(9733)" это извлечение символа которого скорее всего небудет в исходной строке, и это:


text =
(
sec"    "mA"    "mV
3,2452587890625    -0,00311479461379349    0,854992806911469
3,29225610351563    -0,00306393066421151    0,884990870952606
)

text := RegExReplace(text, "`a)(    |\R)", Chr(29733))

StringSplit StringArr, text, % Chr(29733)
Listvars
Pause

также верно, как и код выше, и как это:


text := RegExReplace(text, "`a)(    |\R)", "¶")

StringSplit StringArr, text, ¶

?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

9 (изменено: serzh82saratov, 2013-06-17 10:55:56)

Re: AHK: StringSplit и 4-е подряд пробела.

Что думаете по счёт такого варианта?:


text =
(
sec"    "mA"    "mV
3,2452587890625    -0,00311479461379349    0,854992806911469
3,29225610351563    -0,00306393066421151    0,884990870952606
)


RegExSplit( text, "MyArray", "    |\R", """")
loop % MyArray0
    MsgBox,, MyArray%A_Index%, % MyArray%A_Index%
Listvars

RegExSplit( Str, NameArr, Delimiter, OmmitChr := "")    {
    Local Pos := 1, PrPos := ""
    While (PrPos <> Pos) 
        PrPos := Pos, %NameArr%0 := A_Index - 1
        , Pos := RegExMatch(Str, "S`a)(?<" A_Index ">.*?)(?:" Delimiter "|$)", %NameArr%, Pos) + StrLen(%NameArr%) 
        , %NameArr%%A_Index% := Trim(%NameArr%%A_Index%, OmmitChr)
}
return

Тут нет варианта того, что в тексте окажется символ разделителя для StringSplit.
Результат эдинтичен применению StringSplit.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui