Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.005 c
2-1260698706
Игорь
2009-12-13 13:05
2010.02.07
Определить имеет ли пользователь привилегии администратора


2-1260457480
RWolf
2009-12-10 18:04
2010.02.07
Exit из except-скобок


2-1260531371
alex ford
2009-12-11 14:36
2010.02.07
закинуть в ресурсы файлы


15-1259616617
Юрий
2009-12-01 00:30
2010.02.07
С днем рождения ! 1 декабря 2009 вторник


2-1260482915
Aleks
2009-12-11 01:08
2010.02.07
динамически создаваемые объекты как их удалить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский