Чтение строк файла CSV с использованием MQL5

Я пытаюсь прочитать значение времени последней строки из файла CSV. Проверьте следующее:

2018-07-26 11:04:00 1.17272 1.17275 1.17267 1.17272
2018-07-26 11:05:00 1.17272 1.17273 1.17265 1.17268
2018-07-26 11:06:00 1.17268 1.17273 1.17261 1.17264

Выше приведены примеры данных. Я пробовал следующий код, и результат выглядит следующим образом:

int file = FileOpen("latest.csv",FILE_READ|FILE_SHARE_READ|FILE_CSV|FILE_COMMON);
   if(file != INVALID_HANDLE)
   {
      FileSeek(file,-100,SEEK_END);

      while(!FileIsLineEnding(file))
      {
         Print(FileReadString(file));
      }
   }

   FileClose(file);

Выход:

8-07-26 11:06:00
1.17268
1.17273
1.17261
1.17264

Я не получаю полное значение даты. Даже если я попытаюсь увеличить смещение FileSeek() функция.

Пожалуйста, дайте мне знать, как можно прочитать последнюю строку файла CSV.

1 ответ

Я не знаю mql5, но вот в чем проблема:

  • Файл открывается в режиме csv (FILE_CSV) и похоже FileReadString() читает одно поле (не полную строку) - как FileReadNumber() читает число из столбца. Таким образом, функция продолжает читать отдельные поля, пока не встретится новая строка (и первое поле (date) читается только частично из-за смещения).

Из документов:

При чтении из bin-файла. длина строки для чтения должна быть указана. При чтении из txt-файла длина строки не требуется, и строка будет считана с текущей позиции до символа перевода строки "\r\n". При чтении из csv-файла длина строки также не требуется, строка будет считываться с текущей позиции до ближайшего разделителя или до конечного символа текстовой строки.

Итак, вместо FILE_CSV, с помощью FILE_TXT следует прочитать всю строку. Конечно, вам придется пропустить первую частичную строку (pos -100).

Чтобы прочитать полную последнюю строку:

int file = FileOpen("latest.csv",FILE_READ|FILE_SHARE_READ|FILE_TXT|FILE_COMMON);

   if(file != INVALID_HANDLE)
   {
      FileSeek(file,-100,SEEK_END);

      // skip partial line
      FileReadString(file);

      // read last line
      Print(FileReadString(file));

      FileClose(file);
   }

Чтобы прочитать только последнюю дату, вы все равно можете использовать режим CSV:

int file = FileOpen("latest.csv",FILE_READ|FILE_SHARE_READ|FILE_CSV|FILE_COMMON);

   if(file != INVALID_HANDLE)
   {
      FileSeek(file,-100,SEEK_END);

      // skip partial row
      while(!FileIsLineEnding(file))
      {
          FileReadString(file);
      }

      // read last date
      Print(FileReadString(file));
      // or maybe FileReadDatetime(file);

      FileClose(file);
   }

Кроме того, FileClose () должен быть внутри if{} block,

Другие вопросы по тегам