Чтение строк файла 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
,