Число при чтении .csv файла не соответствует записанному.

 

Имеется .csv файл созданный этими строчками:

         int file = FileOpen(FileName, FILE_READ|FILE_WRITE|FILE_CSV|FILE_ANSI, ',');  
         string row = "";         
               if (file != INVALID_HANDLE)
               {
                  row += mrate[j].time + ",";   //datetime
                  row += Hour + ",";            //uint
                  row += Min + ",";             //uint
                  row += StrTime + ",";         //string
                  row += Val1 + ",";            //float
                  row += Val2 + ",";            //float
                  row += Val3 + ",";            //float
                  row += Val4 + ",";            //float
                  row += Val5 + ",";            //float
                  row += Val6 + ",";            //float
                  row += Val7;                  //float
                  while(FileIsEnding(file) == false) FileSeek(file, 1, SEEK_END);
                  FileWrite(file, row);
               }
               else Print("Ошибка! Не удалось создать ", i, ", т.к. ", GetLastError());
            }
         FileClose(file);

 Этот блок повторяется и создает много строчек в этом же файле. Затем, создается еще много аналогичных файлов.

Получаются файлы 1.csv,  2.csv, 3.csv и т.д. С содержимым типа:

2016.08.22 18:52:00,9,20,1471891920,1.1245,1.1274,1.1306,1.1335,1.1367,1.1396,1.1428

2016.08.19 08:44:00,9,20,1471596240,1.1171,1.1205,1.1259,1.1293,1.1347,1.1381,1.1435

2016.08.18 08:43:00,9,20,1471509780,1.1105,1.1158,1.1214,1.1267,1.1323,1.1376,1.1432

... 

Далее, я читаю другим скриптом любой из файлов так:

   float AllVal [][1000][8];
   ArrayResize(AllVal, 2000, 1000);
   int NewSize = ArraySize(AllVal)/(1000*8);

//-----------------------------------------------------------------------
   for (uint i = 0; i<1000; i++)
   {
      string FileName = Symbol() + "\\DataBase\\" + i + ".csv";
            
      int handle = FileOpen(FileName, FILE_READ|FILE_CSV|FILE_ANSI);
      if (handle == INVALID_HANDLE)
      {
         Alert("Файл ", FileName , " не найден!");
         return;
      }
      int    delimiter_position1 =0;  // Номер позиции первого символа "," в строке
      int    delimiter_position2 =0;  // Номер позиции второго символа "," в строке
      int    strings_count       =0;  // Счетчик строк
      string read_string         =""; // Прочитанная строка
      string read_substring      =""; // Прочитанная подстрока
      ulong  offset              =0;  // Положение указателя (смещение в байтах)
      
      FileSeek(handle,0,SEEK_SET);//--- Переместим файловый указатель в начало файла
      
      int WhileCount = 0;
      while(!FileIsEnding(handle))
      {
         WhileCount++;
         if (WhileCount >= 1000 && strings_count > NewSize - 1000)
         {
            NewSize = ArraySize(AllVal)/(1000*8) + 1000;
            ArrayResize(AllVal, NewSize, 1000);
            WhileCount = 0;
         }
         read_string=FileReadString(handle);

         delimiter_position1=StringFind(read_string,",",0);
         delimiter_position2=StringFind(read_string,",",delimiter_position1+1); // пропустил ячейку datetime
         
         delimiter_position1=delimiter_position2;
         delimiter_position2=StringFind(read_string,",",delimiter_position1+1); // пропустил ячейку uint
         
         delimiter_position1=delimiter_position2;
         delimiter_position2=StringFind(read_string,",",delimiter_position1+1); // пропустил ячейку uint
                
         read_substring=StringSubstr(read_string,delimiter_position1+1, delimiter_position2-delimiter_position1);
         AllVal[strings_count][i][0]=StringToInteger(read_substring);         // загрузил ячейку string в виде int
         
         for (uint count = 1; count <= 7; count++)                              // загрузил 7 раз ячейки в виде double
         {
            delimiter_position1=delimiter_position2;
            delimiter_position2=StringFind(read_string,",",delimiter_position1+1);  
            read_substring=StringSubstr(read_string,delimiter_position1+1, delimiter_position2-delimiter_position1);
            AllVal[strings_count][i][count]=StringToDouble(read_substring);         
         }
         offset=FileTell(handle);//--- Получим текущее положение файлового указателя
         if(FileIsLineEnding(handle))//--- Если это конец строки
         {
            if(!FileIsEnding(handle)) offset++;//--- Перейдем на другую строку, если это не конец файла
            FileSeek(handle,offset,SEEK_SET);//--- Переместим указатель относительно начала файла
            strings_count++;
         }
      }
      FileClose(handle);
   }
   Print(AllVal[0][0][0]);            // проверяю верность прочтения ячеек

 Вот в чем проблема:

 Значения выделенные зеленым читаются верно, а выделенные красным - нет:

1471891968.0 ,1.1245 ,1.1274 ,1.1306 ,1.1335 ,1.1367 ,1.1396 ,1.1428

1471596288.0 ,1.1171 ,1.1205 ,1.1259 ,1.1293 ,1.1347 ,1.1381 ,1.1435 - прочитанные значения.

1471509760.0 ,1.1105 ,1.1158 ,1.1214 ,1.1267 ,1.1323 ,1.1376 ,1.1432


2016.08.22 18:52:00,9,20,1471891920,1.1245,1.1274,1.1306,1.1335,1.1367,1.1396,1.1428

2016.08.19 08:44:00,9,20,1471596240,1.1171,1.1205,1.1259,1.1293,1.1347,1.1381,1.1435 - записанные значения, которые

2016.08.18 08:43:00,9,20,1471509780,1.1105,1.1158,1.1214,1.1267,1.1323,1.1376,1.1432   именно так видны в блокноте.

 Значения выделенные красным отличаются в последних 2-3 цифрах.

Ну и вопрос - в чем может быть проблема ?

Уже спасибо. 

 

во первых mql более-менее сносно работает с CSV и нет необходимости парсить таким образом файлы.

(лень продираться сквозь простыню приложенного кода,но)  существенная разница в прочитанном/записанном/конвертированном может быть например в GMT..вы ж время таким образом сохранили ?

 
Maxim Kuznetsov:

во первых mql более-менее сносно работает с CSV и нет необходимости парсить таким образом файлы.

(лень продираться сквозь простыню приложенного кода,но)  существенная разница в прочитанном/записанном/конвертированном может быть например в GMT..вы ж время таким образом сохранили ?

Здесь два столбика времени - первый в datetime (чтоб ориентироваться на графике) и четвертый столбик string - кол-во секунд прошедших с какого-то там года чтоб была линейная абсолютная координата. Первый столбик указывает GMT. Но при чтении из файла он меня не интересует, я его не читаю.

А создан такие файлы для того чтоб достаточно было один раз все эти значения посчитать (это долго и они в принципе не меняются), а затем использовать многократно в разных местах и диапазонах.

 
Замените float на double
 
A100:
Замените float на double
Заменил. И при заполнении файла, и при чтении - результат такой же.
 
Проблема все еще не решена? Сделайте два скрипта, что бы любой желающий мог воспроизвести проблему у себя, тогда дело может и сдвинется.
 
Justinas Shimkus:
Заменил. И при заполнении файла, и при чтении - результат такой же.

где-то не там заменяли :-)


  float f;
   f=StringToInteger("1471891920");
   Print(f);

   /// получится (фанфары!!) 1471891968.0


проблема лоцирована - правьте код..и впредь включайте #property strict и обращайте внимание на ошибки и предупреждения компилятора