Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
А что там сложного? Завести переменные для текущей позиции, текущего статуса, начала подстроки
Пробежаться по строке и в зависимости от состояния и встреченного символа устанавливать новое состояние и выделять подстроку.
Подстроки складываются в очередь ( по вкусу, позиция + длина, &String на вырезку или копированием подстроки)
Что-то навскидку у себя не раскопаю, хотя и есть...
SplitClass.Init PROCEDURE(STRING Text)
Cnt LONG
TextLen LONG
LoopInWord BYTE
StartWord LONG
WordSize LONG
CODE
TextLen = LEN(CLIP(Text))
LOOP Cnt = 1 TO TextLen
! если пробел или таб
IF Text[Cnt] = ' ' OR Text[Cnt] = CHR(9)
IF LoopInWord = TRUE
LoopInWord = FALSE
WordSize = Cnt - StartWord
!debug.Show(SUB(Text, StartWord, WordSize))
END
ELSE
IF LoopInWord = FALSE
LoopInWord = TRUE
StartWord = Cnt
END
END
END
IF LoopInWord = TRUE
WordSize = Cnt - StartWord
!debug.Show(SUB(Text, StartWord, WordSize))
END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Примерно так, правда подстроки не складируются. Len(Clip(text)) вызовет копирование текста, если текст реально длинный - нехорошо...
Тут главная оптимизация - не менять исходную строку и не копировать подстроки.
Например, складывать подстроки в очередь
StrQ Queue
Str &String
End
....
StrQ.str &= S[ i# : j# ] ; Add(strQ)
Вырезка является ссылкой на строку, можно её хранить в &String, не меняя исходную строку
Ну и, разумеется, не пользовать Instring и Sub, с копированием исходной строки...
Ал писал(а): ↑15 Июнь 2017, 16:53Text = ' qwqwewe qwewewe...'
Что не так с этой строкой?
Мне нужно парсить такое. Это логи радиолюбительских соревнований.
Формат может немного различаться. В каждой строке форматирование может быть от руки...
Yufil писал(а): ↑15 Июнь 2017, 16:18StrQ.str &= S[ i# : j# ] ; Add(strQ)
Вырезка является ссылкой на строку, можно её хранить в &String, не меняя исходную строку
Ну и, разумеется, не пользовать Instring и Sub, с копированием исходной строки...
Отличный совет. Спасибо
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
SplitClass.Construct PROCEDURE
CODE
SELF.Items &= NEW ItemsQueue
SplitClass.Destruct PROCEDURE
CODE
SELF.ClearAll
DISPOSE(SELF.Items)
SplitClass.Init PROCEDURE(STRING Text)
Result &STRING
Cnt LONG
TextLen LONG
LoopInWord BYTE
StartWord LONG
CODE
TextLen = LEN(CLIP(Text))
LOOP Cnt = 1 TO TextLen
! если пробел или таб
IF Text[Cnt] = ' ' OR Text[Cnt] = CHR(9)
IF LoopInWord = TRUE
LoopInWord = FALSE
Result &= NEW STRING(Cnt - StartWord)
Result = Text[StartWord : Cnt]
SELF.Add(Result)
END
ELSE
IF LoopInWord = FALSE
LoopInWord = TRUE
StartWord = Cnt
END
END
END
IF LoopInWord = TRUE
Result &= NEW STRING(Cnt - StartWord)
Result = Text[StartWord : Cnt]
SELF.Add(Result)
END
SplitClass.Add PROCEDURE(*STRING Text)
CODE
SELF.Items.Item &= Text
ADD(SELF.Items)
SplitClass.Count PROCEDURE()!,LONG
CODE
RETURN RECORDS(SELF.Items)
SplitClass.Get PROCEDURE(LONG Number)!,STRING
CODE
GET(SELF.Items, Number)
RETURN SELF.Items.Item
SplitClass.ClearAll PROCEDURE
Cnt LONG
CODE
LOOP Cnt = 1 TO RECORDS(SELF.Items)
GET(SELF.Items, Cnt)
DISPOSE(SELF.Items.Item)
END
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Ал писал(а): ↑15 Июнь 2017, 16:53Text = ' qwqwewe qwewewe...'
Что не так с этой строкой?
Мне нужно парсить такое. Это логи радиолюбительских соревнований.
Формат может немного различаться. В каждой строке форматирование может быть от руки...
Ал писал(а): ↑15 Июнь 2017, 18:52форматы могут быть совсем любые? т.е. этот текст надо читать напрямую, нельзя например через excel/calc перегнать например в csv и потом читать?
Да нет. Уже все работает и парсится.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Yufil писал(а): ↑15 Июнь 2017, 18:49Насчёт двойного освобождения памяти - очень интересно... Может быть, надо очистить ссылку перед присвоением значения...
Завтра посмотрю. А то 2 ночи
Еще вопрос. Как по такой очереди GET по полю делать, что то не работает. Перебирать?