1

我正在尝试从 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 文件的最后一行。

4

1 回答 1

1

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

  • 该文件以 csv 模式 ( FILE_CSV) 打开,它看起来像FileReadString()读取单个字段(不是整行) - 就像FileReadNumber()从列中读取数字一样。因此,该函数会一直读取单独的字段,直到遇到换行符(并且第一个字段 ( date) 由于偏移量而仅被部分读取)。

文档

从 bin 文件中读取时。必须指定要读取的字符串的长度。从 txt 文件读取时,不需要字符串长度,字符串将从当前位置读取到换行符“\r\n”。从 csv-file 读取时,字符串长度也不是必需的,字符串将从当前位置读取到最近的分隔符或直到文本字符串结束字符。

因此,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.

于 2018-07-26T19:45:32.990 回答