我正在尝试从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文件的最后一行。
答案 0 :(得分:1)
我不知道mql5,但这是我认为问题所在:
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
内。