Проблема загрузки данных из csv файла

 

Приветствую господа трейдеры. Ломаю голову уже не один час но так и не могу понять в чём ошибка при загрузке данных из файла КСВ с разделителем точка запятой?

Собственно функция :

for(int a=0; a<5 && !IsStopped(); a++)
   {

      int h=FileOpen("OpenI\\"+Name_File1,FILE_READ|FILE_ANSI|FILE_CSV|FILE_COMMON,";");
      if(h==INVALID_HANDLE)
      {
         printf("Ошибка открытия файла для чтения %s # %i",Name_File1,GetLastError());
         return false;
      }
      else
      {
         ResetLastError();
         int pos=0; // при помощи этой переменной будем считать количество строк файла
            int line=0;
         while(!FileIsEnding(h))
           {
            ArrayResize(DATA_TMP,line+1,1000);
            //DATA_TMP[line].time=0;       
            DATA_TMP[line].oi=0.0;       
            DATA_TMP[line].dl=0.0;     
             
            string str=FileReadString(h);                           // читаем очередную строку из файла
            if (pos==0)StartReadTime=StringToTime(str);
            if (StartReadTime>Starttime) {
            if(pos==0) DATA_TMP[line].time=StringToTime(str);       //если запись первая, т.е. дата, то конвертируем из стринга в дататайм
            if(pos==1) DATA_TMP[line].oi=StringToDouble(str);       //если запсиь вторая, т.е. ОИ, то конвертируем в инт и 
            if(pos==2) DATA_TMP[line].dl=StringToDouble(str);     //если запсиь вторая, т.е. Delta, то конвертируем в инт и 
            }
            pos++; // увеличиваем счетчик прочитанных строк
            //Print(TimeToString(DATA_TMP[line].time));
            if(FileIsLineEnding(h)) {pos=0; line++;}
           }
         //StartReadTime=0;  
         FileClose(h);
        // Sleep(1000);
       // Print("line: ",line);
      break;
      }
   }
Как из ней видно она читает файл в котором есть три столбца разделённых точка с запятой. Данные в файле есть и упорядочены. То есть в файле три одинаковых столбца данных. Дата, ОИ и Дельта. Однако при считывании файла данные из среднего столбца постоянно нулевые. То есть читается только первый столбец и последний. Сколько бы не ломал голову никак не могу понять что не так? Помогите, вроде и код простенький и предельно понятный но факт. НЕ РАБОТАЕТ!!! Может я чего то не знаю? Заранее благодарю!!!!
 
Mihail Marchukajtes:

Приветствую господа трейдеры. Ломаю голову уже не один час но так и не могу понять в чём ошибка при загрузке данных из файла КСВ с разделителем точка запятой?

Собственно функция :

Как из ней видно она читает файл в котором есть три столбца разделённых точка с запятой. Данные в файле есть и упорядочены. То есть в файле три одинаковых столбца данных. Дата, ОИ и Дельта. Однако при считывании файла данные из среднего столбца постоянно нулевые. То есть читается только первый столбец и последний. Сколько бы не ломал голову никак не могу понять что не так? Помогите, вроде и код простенький и предельно понятный но факт. НЕ РАБОТАЕТ!!! Может я чего то не знаю? Заранее благодарю!!!!

во первых - победите все предупреждения компилятора.. :-) ";" и ';' - сильно разные вещи

и ещё перед StringToDouble неплохо заменять в строке запятые на точки , а пробелы удалять. 

 
Maxim Kuznetsov #:

во первых - победите все предупреждения компилятора.. :-) ";" и ';' - сильно разные вещи

и ещё перед StringToDouble неплохо заменять в строке запятые на точки , а пробелы удалять. 

Спасибо за ответ но он ни к чему не привёл увы.

Во первых я компелиру советники в режиме strict, надеюсь Вы в курсе что это такое и ни одного предупреждения не говоря уж про ошибку нет,

Во вторых файл у меня выглядит примерно вот так.


Где как Вы видите идёт дата, которая читается прекрасно, потому как она записана другим советником, ОИ имеет сугубо положительное значение ну а дельта она и в африке дельта. То есть когда два столбца было всё читалось без проблем, стоило добавить ещё один и внутренний столбец просто перестал читаться.

Продолжаю ожидать помощи. Спасибо!

 
Проблема сводится к не исполнению условия когда pos=1, то есть второй столбец!!!
 

а третий - это не 2-ой?

потом делаем третий, он так же через один

помню было такое, тоже плюхался...

т.е. делаем одно считывание в холостую
 
Mihail Marchukajtes #:
Проблема сводится к не исполнению условия когда pos=1, то есть второй столбец!!!

Как то странно, ты конвертишь полную строку во время, целое и дабл. 

string str=FileReadString(h);     // это целая строка из трех записей.

У тебя первые две записи фиксированные. Может лучше читать с позиции по позицию и только потом конвертить.

 
Renat Akhtyamov #:

а третий - это не 2-ой?

потом делаем третий, он так же через один

помню было такое, тоже плюхался...

Та нет же. По сути выводится только 0 и 2, а 1 не выводится :-(
 
Mihail Marchukajtes #:
Та нет же. По сути выводится только 0 и 2, а 1 не выводится :-(

а ты его обнуляешь, вот и не выводится :-)

            DATA_TMP[line].oi=0.0;       
            DATA_TMP[line].dl=0.0;  
 
Valeriy Yastremskiy #:

Как то странно, ты конвертишь полную строку во время, целое и дабл. 

У тебя первые две записи фиксированные. Может лучше читать с позиции по позицию и только потом конвертить.

Нет только во время и дабл. Но при считывании из ксв файла строка читается от положение курсора до первого разделителя. То есть сничала прочитал дату, если поз =0 то я знаю что это дала, дальше читаю строку от даты и до дельты, записываю в структуру .oi потом читаю ещё раз до конца файла, при этом после прочтения сроки не забывая увеличить счётчик на +1 после прочтения. Когда добрались до конца строки поз обнуляеться. 
 
Maxim Kuznetsov #:

а ты его обнуляешь, вот и не выводится :-)

Это такой способ инициализации массива, когда не посредственно перед записью в ячейку она предварительно обнуляется. НО Вы оказались абсалютно правы, я забыл что он эти строчки выполняет перед каждым считыванием. Вот я лох. Спасибо большое за подсказку. Правильнее будет вот так

            if (pos==1)DATA_TMP[line].oi=0.0;       
            if (pos==2)DATA_TMP[line].dl=0.0;     


Как говорят в наших кругах "Благодарствую серый ёж " :-)

 

Попробуйте для работы с csv файлами использовать класс CSV fast.mqh , который можно взять тут - этот класс я использую постоянно и очень доволен!

Там всё описано на русском языке, в моей статье есть примеры по использованию - всё продумано для применения в МО.

CatBoost bin continuous
CatBoost bin continuous
  • www.mql5.com
Чтение и применение моделей CatBoost