Парсер текстовой строки.

 
Есть ли готовая реализация?

Желательно в виде функции в которую передаём текстовый символ и по этому символу парсится строка.
Пример строки:
1271548800;20;5;25;15;75;-140;0.098;0.3;26;100;0;16;-22;-90;2010.4.12;2010.4.18;

Написать не проблема, но пиво блин уже не лезит, а без пива не программируется ))))))

Если есть хотябы приблизительный код на основе
string StringSubstr( string text, int start, int length=0)
int StringLen( string text)
int StringGetChar( string text, int pos)
int StringFind( string text, string matched_text, int start=0)

 

что значит парсится ? преобразовать строку в массив со значениями?

 
Loky >>:

что значит парсится ? преобразовать строку в массив со значениями?

Да.

 
HIDDEN >>:
Есть ли готовая реализация?
Желательно в виде функции в которую передаём текстовый символ и по этому символу парсится строка.

С год-полтора назад кто-то выкладывал индикатор, в котором в одной строке задавалась сразу группа параметров. Строка разбиралась, естессно. Вспомнить пока не получается.

Мне кажется проще самому написать. Под конкретную задачу несложно. Вот если универсальную делать - много проверок будет, и вообще с типизацией гемморой.

// А что значит "в функцию передаётся текстовый символ, и по этому символу парсится"? Не смог однозначно проинтерпретировать.

 
на mql у меня готовых "болванок" пока нет, а вот на delphi уже собралось, посмотри может разберешься сам:

var
    Text: string;
    s: array of string;
begin
x:=1;
i:=1;
tmp:='';
repeat
repeat
  tmp:=tmp+Text[x];
  inc(x);
  until Text[x]<>';';
s[i]:=tmp;
tmp:='';
inc(i);
until x<Length(Text)
end;

 nn
 
Здесь (см. комментарий).
 
     int pos=StringFind(out,",",0);
     in[i][x]=StrToDouble(StringSubstr(out,0,pos+1));
     out=StringSubstr(out,pos+1,0);
Вместо запятой, ставьте ваш разделитель и в цикл его - пока строка не закончиться
 
Вот я себе в инклудники файл такой помаленьку собираю - часть из общих источников, часть сам писал - там вроде есть, то что нужно - называется StringExplode.
Файлы:
strings.mqh  4 kb
 
Не помню у кого содрал но вот работает :

//+----------------------------------------------------------------------------+
//| Чтение лотов                                                               |
//+----------------------------------------------------------------------------+
int ReadLots(){
   int    i=0, np;
   string st, tmp=lotsStr;
   ArrayResize(lot, 0);

   while (StringLen(tmp)>0) {
      np=StringFind(tmp, ";");
      if (np<0) {
         st=tmp;
         tmp="";
      } else {
         st=StringSubstr(tmp, 0, np);
         tmp=StringSubstr(tmp, np+1);
      }
      st=StringTrim(st); 
      if(st=="")  break;
      ArrayResize(lot, i+1);
      lot[i]=StrToDouble(st);
      i++;
   }
   return(i);
}
 
extern string           PercentsLots="50/30/10/5/5";// последовательность процентов дробления лота ордера
extern string           LevelsSbrosa="50/100/150/200/250";// последовательность уровней сброса лотов

string NameExpert="Мой советник";

// -------- лотовые массивы -------------------------------------------
double  PercentLotsMass[1]; 
double  RealLotsMass[1];
int     LevelsMass[1];
int     RealStopLoss[1];
bool    DobroSbrosa[1];
// -----------------
int     SkolkoLotov,SkolkoTeikov;

int start (){
  
  if(!ProverkaStroki(PercentsLots) && PercentsLots!=""){
    Alert("Перезагрузите советника - его работа остановлена");
    Alert("Ошибка! В параметре PercentsLots - введён некорректный символ!");
    Alert("================= ",NameExpert," =================");
    return(0);
  }
  if(!ProverkaStroki(LevelsSbrosa) && LevelsSbrosa!=""){
    Alert("Перезагрузите советника - его работа остановлена");
    Alert("Ошибка! В параметре LevelsSbrosa - введён некорректный символ!");
    Alert("================= ",NameExpert," =================");
    return(0);
  }
  SkolkoLotov=SchChisel_v_Str(PercentsLots);// на сколько частей нужно дробить лот
  SkolkoTeikov=SchChisel_v_Str(LevelsSbrosa);// сколько уровней для сброса лотов
  if(SkolkoLotov!=SkolkoTeikov && PercentsLots!=""){
    Alert("Перезагрузите советника - его работа остановлена");
    Alert("Ошибка! В PercentsLots должно быть столько же чисел, сколько в LevelsSbrosa");
    Alert("================= ",NameExpert," =================");
                Dobro=false;
                return(0);
        }
// --------- меняем размерность массивов ---------------
        ArrayResize(PercentLotsMass,SkolkoLotov+1);
        ArrayResize(RealLotsMass,SkolkoLotov+1);
        ArrayResize(LevelsMass,SkolkoLotov+1);
        ArrayResize(RealStopLoss,SkolkoLotov+1);
        ArrayResize(DobroSbrosa,SkolkoLotov+1);

Initsialize_2_Array();

}

// ------------ Пользовательские подпрограммы ----------------- 
// ------------------- Initsialize_2_Array() -------------------------------------------------------
//функция инициализирует все массивы значениями
// ---------------------------------------------
void Initsialize_2_Array(){
        int Symbolov,i,Sch;
        string  Temp="",Temp1="";
        // -------- сначала лоты -------------
        Symbolov=StringLen(PercentsLots);
        Sch=0;
        Temp="";
        Temp1="";
        for(i=0;i<=Symbolov-1;i++){
                // проходим до разделителя, накапливая символы в переменную Temp
                Temp=StringSubstr(PercentsLots,i,1);
                Temp1=Temp1+StringSubstr(PercentsLots,i,1);
                if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ
                        Sch++;
                        PercentLotsMass[Sch]=StrToDouble(Temp1);
                        Temp1="";
                }
        }
        // -------- теперь уровни профита ----------
        Symbolov=StringLen(LevelsSbrosa);
        Sch=0;
        Temp="";
        Temp1="";
        for(i=0;i<=Symbolov-1;i++){
                // проходим до разделителя, накапливая символы в переменную Temp
                Temp=StringSubstr(LevelsSbrosa,i,1);
                Temp1=Temp1+StringSubstr(LevelsSbrosa,i,1);
                if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ
                        Sch++;
                        LevelsMass[Sch]=StrToInteger(Temp1);
                        Temp1="";
                        if(Sch==1){
                                RealStopLoss[1]=0;
                        }
                        else{
                                RealStopLoss[Sch]=LevelsMass[Sch-1];
                        }
                }
        }
}
// ------------------- SchChisel_v_Str() -----------------------------------------------------------
// функция подсчитывает количество чисел в строке
// ------------------------------------------------
int SchChisel_v_Str(string Text){
        int Symbolov=(-1),Chisel=(0);
        string  Temp="";
        Symbolov=StringLen(Text);
        for(int i=0;i<=Symbolov-1;i++){
                Temp=StringSubstr(Text,i,1);
                if(Temp=="/" || i==Symbolov-1){//это разделитель, или последний символ
                        Chisel++;
                }
        }
        return(Chisel);
}
// ----------------------------- ProverkaStroki() --------------------------------------------------
// функция проверяет корректность использованных в строке символов
//     АЛЕРТЫ В ЭТОЙ ФУНКЦИИ НЕ ТРОГАТЬ!!!! ОНИ ЗАВЯЗАНЫ НА ПРОВЕРКУ!!!!!
// ---------------------------------------------------------------
bool ProverkaStroki(string Text){
        string  NameFunction="ProverkaStroki()",Temp;
        int                     Skolko_v_Stroke=(-1);
        Skolko_v_Stroke=StringLen(Text);
        //Alert("Строка ",Text," состоит из ",Skolko_v_Stroke," символов");
        for(int i=0;i<=Skolko_v_Stroke-1;i++){
                Temp=StringSubstr(Text,i,1);
                //Alert("на итерации ",i," Temp = ",Temp);
                if(Temp!="0" && Temp!="1" && Temp!="2" && Temp!="3" && Temp!="4" && Temp!="5" && Temp!="6" && Temp!="7" && Temp!="8" && Temp!="9" && Temp!="/" && Temp!="."){
                        Alert("В переменной ",Text," присутствует некорректный символ ",Temp);
                        Alert("================= ",NameFunction," =================");
                        return(false);
                }
        }
        return(true);
}
Не судите строго если что-то не так. Код я привёл лишь для примера, чтоб человек мог понять принцип.