Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
ВнизПарсер строки Найти похожие ветки
← →
novai (2009-12-10 07:30) [0]есть TStringList со строками типа:
установить 100 100
идти 10 10
задержать 20
повоторить
как правильно пропарсить строки, чтобы получить содержимое в 3х переменных?
например итог парсера первой строки:var
cmd, param1, param2: strings;
...
парсим строку на выходе получаем:
cmd:= "идти";
param1:="10";
param2:="10";
← →
novai (2009-12-10 07:35) [1]сделал пока так:
procedure TScriptedObj.ScriptStart;
const delimeter=" ";
var
all, cmd, param1, param2:string;
n,n2:integer;
begin
// парсер текущей строки скрипта
cmd:="";
param1:="";
param2:="";
n:=1;
all:= script.Strings[scriptpos];
for n2:=1 to length(all) do
begin
if all[n2] = delimeter
then inc(n)
else
case n of
1: cmd:=cmd+all[n2];
2: param1:=param1+all[n2];
3: param2:=param2+all[n2];
end;
end;
← →
novai (2009-12-10 07:36) [2]стоит ли использовать pos итп? если да - почему?
← →
MBo © (2009-12-10 08:14) [3]проще всего TStringList.CommaText использовать
← →
Kyn66 © (2009-12-10 09:08) [4]Если количество столбцов всегда одинаково, то для этих целей есть у RX хорошая функция ExtractWord
function ExtractWord(N: Integer; const S: string; const WordDelims: TCharSet): string;
Example
S := "Let him go";
S1 := ExtractWord(2, S, [" "]);
{ here S1 = "him" }
← →
novai (2009-12-10 09:42) [5]
> проще всего TStringList.CommaText использовать
посмотрел как реализовано... у меня наверное проще...
> то для этих целей есть у RX
зачем мне еще сторонние компоненты? для этой цели и свое подойдет...
всем спасибо, остановлюсь на своем варианте...
← →
novai (2009-12-10 09:43) [6]а можно ли как нибудь оптимизировать мой код?
← →
Медвежонок Пятачок © (2009-12-10 09:46) [7]// парсер текущей строки скрипта
если скрипт будет не тупо в плайнтексте, то и парсить его не потребуется.
ну и оптимизация будет не нужна
← →
Сергей М. © (2009-12-10 09:47) [8]
> у меня наверное проще
В ini-формате будет еще проще - готовый парсер представлен классом TIniFile
[CMD1]
Name=установить
Param1=100
Param2=100
[CMD2]
Name=идти
Param1=10
Param2=10
[CMD3]
Name=задержать
Param1=20
[CMD4]
Name=повоторить
← →
novai (2009-12-10 10:08) [9]
> если скрипт будет не тупо в плайнтексте, то и парсить его
> не потребуется.
> ну и оптимизация будет не нужна
почему, когда новички спрашивают, что можно сделать, Вы, в основном отвечаете: если не, то ничего не надо! Я же задал конкретный вопрос?
> В ini-формате будет еще проще - готовый парсер представлен
> классом TIniFile
к сожалению, одна строка - одна команда с доп параметрами...
← →
Медвежонок Пятачок © (2009-12-10 10:10) [10]Я же задал конкретный вопрос?
ты задал тупой вопрос.
твой код который ты привел работает?
работает.
он сильно тормозит программу?
думаю что нет.
так какого такого задавать вопрос про оптимизацию твоего кода?
← →
Медвежонок Пятачок © (2009-12-10 10:12) [11]или под оптимизацией мы понимаем меньший объем кода?
если так, то надо думать над структурой данных, которую ты используешь для описания скрипта.
тогда и код будет компактнее и дурацких вопросов не будет.
← →
novai (2009-12-10 10:13) [12]
> ты задал тупой вопрос.
это решать не Вам
> так какого такого задавать вопрос про оптимизацию твоего
> кода?
любой код новичка можно оптимизировать, вот я и хочу этого? Мастера могут подсказать, как более правильно сделать, то что реализовал я (в силу своих знаний)
← →
novai (2009-12-10 10:15) [13]
> то надо думать над структурой данных, которую ты используешь
> для описания скрипта.
разве Вам структура не понятна? Я все привел в своем вопросе
← →
Медвежонок Пятачок © (2009-12-10 10:15) [14]когда же тебе называют готовые решения в виде екстрактвордс ты тупо заявляешь нахрена козе чужой боян, коза свои бояны будет юзать.
после чего снова с тупым упорством спрашиваешь "ну как же мне оптимизировать мой код?"
← →
novai (2009-12-10 10:15) [15]
> или под оптимизацией мы понимаем меньший объем кода
и это тоже, но не в ущерб читаемости...
← →
Медвежонок Пятачок © (2009-12-10 10:16) [16]разве Вам структура не понятна? Я все привел в своем вопросе
Мне она понятна. И мне понятно, что она не самая оптимальная.
← →
Медвежонок Пятачок © (2009-12-10 10:18) [17]Мастера могут подсказать, как более правильно сделать
Тебе уже подсказали и как код оптимизировать (уменьшить)
И как скрипт хранить таким образом, чтобы чтение его было более простым.
Но ты же умнее всех. Советы они не для тебя.
← →
novai (2009-12-10 10:19) [18]
> Мне она понятна. И мне понятно, что она не самая оптимальная.
буду рад услышать более оптимальный вариант... требования к структуре в 9 посте (в конце).
← →
novai (2009-12-10 10:20) [19]
> Советы они не для тебя.
все приведенные советы я просмотрел (кроме сторонней библиотеки) и объяснил почему не подходит...
← →
Медвежонок Пятачок © (2009-12-10 10:20) [20]требования к структуре в 9 посте (в конце).
И чьи это требования?
Ассамблеи ООН или магатэ?
← →
novai (2009-12-10 10:21) [21]
> И чьи это требования?
> Ассамблеи ООН или магатэ?
а это важно? главное они есть, что ограничивает варианты реализации
← →
Медвежонок Пятачок © (2009-12-10 10:26) [22]На держи.
команда в одной строке, параметры за командой
<script>
<cmd type="идти" param1="на юг" param2="молча" />
<cmd type="учиться" param1="слушать" param2="если задаешь вопросы" />
</script>
требования выполнены?
← →
novai (2009-12-10 10:28) [23]
> требования выполнены?
нет
1.
> <script>
первая команда
> <cmd type="идти" param1="на юг" param2="молча" />
вторая команда
и соответственно не на одной строке...
← →
Сергей М. © (2009-12-10 10:30) [24]
> novai
И где в этих требованиях фигурирует недопустимость использование запятой в кач-ве разделителя ?
← →
Медвежонок Пятачок © (2009-12-10 10:30) [25]одна команда занимает ровно одну строку. ничего иного в "требованиях" не сказано
← →
novai (2009-12-10 10:34) [26]
> И где в этих требованиях фигурирует недопустимость использование
> запятой в кач-ве разделителя ?
вообще, нужен пробел, но возможно и запятую, а это к чему Вы спросили?
← →
novai (2009-12-10 10:35) [27]
> одна команда занимает ровно одну строку. ничего иного в
> "требованиях" не сказано
да, а теперь простейший обработчик, чтобы выбрать параметры и занести в переменные...
← →
Сергей М. © (2009-12-10 10:38) [28]
> к чему Вы спросили?
К тому что про TStringList.CommaText тебе уже был намек.
Но ты уперся - "у меня проще".
А намек был неспроста - CSV-парсер в составе TStringList.CommaText достаточно оптимален и по производительности и по ресурсам, и не идет ни в какое сравнение с тем что ты налепил в [1]
← →
Медвежонок Пятачок © (2009-12-10 10:39) [29]xml документ.
получение значения атрибута узла по имени этого атрибута.
cmd := inode.attributes["cmd"];
param1 := inode.attributes["param1"];
....
← →
novai (2009-12-10 10:43) [30]
> и не идет ни в какое сравнение с тем что ты налепил в [1]
те у меня более ресурсоемко?
можно пример для TStringList.CommaText?
> xml документ.
я понял, но это опять доп. модуль... да и я не думаю, что он предназначен для таких мелочей, как моя...
← →
Сергей М. © (2009-12-10 10:49) [31]
> у меня более ресурсоемко?
Конечно)
> пример для TStringList.CommaText
OtherStringList.CommaText := MyStringList[i];
в рез-те в OtherStringList[0] - имя команды, а в OtherStringList[>0] - возможные параметры
← →
Медвежонок Пятачок © (2009-12-10 10:55) [32]я понял, но это опять доп. модуль...
этот модуль такой же "дополнительный" как и модуль стринглиста
← →
novai (2009-12-10 10:59) [33]попробовал вот так:
d.CommaText:="1 2 3";
memo1.Lines.Add( d.Strings[0]);
memo1.Lines.Add( d.Strings[1]);
memo1.Lines.Add( d.Strings[2]);
d.Free;
почему работает с разделителем пробел? ведь нужен разделитель запятая?
остановлюсь на этом варианте... Спасибо Сергей!
← →
Сергей М. © (2009-12-10 11:01) [34]
> novai
Ты, конечно, можешь хранить в файле свои строки и с разделителями-пробелами, но тогда придется делать доп.телодвижения, не лучшим образом сказывающиеся на сквозной производительности:
OtherStringList.CommaText := StringReplace(MyStringList[i], " ", ",", [rfReplaceAll]);
← →
clickmaker © (2009-12-10 11:01) [35]> почему работает с разделителем пробел? ведь нужен разделитель
> запятая?
справку нифига не читаем
When assigning CommaText, the value is parsed as SDF formatted text. For SDF format, strings are separated by commas or spaces, and optionally enclosed in double quotes. Double quote marks that are part of the string are repeated to distinguish them from the quotes that surround the string. Spaces and commas that are not contained within double quote marks are delimiters. Two commas next to each other will indicate an empty string, but spaces that appear next to another delimiter are ignored. For example, suppose CommaText is set to:
"Stri,ng 1", "Stri""ng 2" , String 3,String4
The list will then contain:
Stri,ng 1
Stri"ng 2
String
3
String4
← →
novai (2009-12-10 11:03) [36]
> clickmaker © (10.12.09 11:01) [35]
спасибо за разъяснения...
← →
Сергей М. © (2009-12-10 11:03) [37]> почему работает с разделителем пробел?
Это "подводная" особенность парсера в составе стринглиста.
Лучше на нее не полагаться, ибо при CommaText-парсинге строки вида
xxx , yyy , zzz
грабли будут обеспечены
← →
novai (2009-12-10 11:05) [38]тогда всеж буту применять:
> OtherStringList.CommaText := StringReplace(MyStringList[i],
> " ", ",", [rfReplaceAll]);
для замены моего разделителя пробел, на его разделитель запятую перед комматекст...
← →
Сергей М. © (2009-12-10 11:08) [39]Если ты гарантируешь, что строки в файле не могут быть иными, нежели вида
xxx yyy zzz
то достаточно [33]
← →
novai (2009-12-10 11:15) [40]
> Если ты гарантируешь, что строки в файле не могут быть иными,
> нежели вида
да все слитно и разделено пробелами, значит на 33 посте остановлюсь...
еще раз - Спасибо!
Страницы: 1 2 вся ветка
Форум: "Начинающим";
Текущий архив: 2010.02.07;
Скачать: [xml.tar.bz2];
Память: 0.54 MB
Время: 0.004 c