使用MQL5读取CSV文件行

时间:2018-07-26 10:58:51

标签: file csv mql5 metatrader5

我正在尝试从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 个答案:

答案 0 :(得分:1)

我不知道mql5,但这是我认为问题所在:

  • 该文件以csv模式(FILE_CSV)打开,看起来FileReadString()读取单个字段(不是整行)-就像FileReadNumber()从a读取数字柱。因此,该函数将继续读取单独的字段,直到遇到换行符为止(由于偏移量,第一个字段(date)仅被部分读取)。

来自docs

  

从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内。