Поставить указатель на начало последней строки в .csv файле

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Evgeniy Zhdan
15386
Evgeniy Zhdan  

Всем привет!

Ребята, как поставить указатель FileSeek на начало предпоследней и последней строки в файле?

Мне надо вытянуть из файла из файла вот эти два значения на картинке. Уже много чего перепробовал, но результата не могу добиться.

Буду очень признателен за любую помощь. Спасибо.

Dmitry Fedoseev
55937
Dmitry Fedoseev  

Поставить указатель в конец, получить его значение, вычесть из него 1, установить указатель на вычисленную позицию, считать один символ, и т.д. пока не будет прочитан символ \r или \n, или позиция указателя не станет 0.

А прям такие мегагромадные файлы, что просто прочитать его весь построчно нельзя? 

Yuriy Asaulenko
9250
Yuriy Asaulenko  

 Только перебором и счетом строк - https://www.mql5.com/ru/docs/files/filereadstring  Это сейчас вам нужна предпоследняя, потом и другие понадобятся.))

Хотите непосредственно заданную строку - SQLite вам в помощь. В ДЛЛ всего-то 5 необходимых функций для всего. Остальные  на любителя.)

Документация по MQL5: Файловые операции / FileReadString
Документация по MQL5: Файловые операции / FileReadString
  • www.mql5.com
При чтении из bin-файла обязательно указывать длину читаемой строки. При чтении из txt-файла длину строки указывать не надо, будет прочитана строка от текущего положения до признака перевода строки "\r\n". При чтении из csv-файла длину строки также указывать не надо, будет прочитана строка от текущего положения до ближайшего разделителя либо до...
Evgeniy Zhdan
15386
Evgeniy Zhdan  
Dmitry Fedoseev:

Поставить указатель в конец, получить его значение, вычесть из него 1, установить указатель на вычисленную позицию, считать один символ, и т.д. пока не будет прочитан символ \r или \n, или позиция указателя не станет 0.

А прям такие мегагромадные файлы, что просто прочитать его весь построчно нельзя? 

Это он такой после 5 секундного прогона. Он будет большой в боевых условиях.

Благодарю за ответ, милейший.

Yuriy Asaulenko
9250
Yuriy Asaulenko  
Evgeniy Zhdan:

Это он такой после 5 секундного прогона. Он будет большой в боевых условиях.

Благодарю за ответ, милейший.

Вы этот указатель никогда на последнюю строку не поставите, т.к. пока вы соберетесь туда его ставить, еще неск строк добавятся.) А когда начнете читать, то строка, может случиться, будет уже далеко не последней.

Evgeniy Zhdan
15386
Evgeniy Zhdan  
Yuriy Asaulenko:

 Только перебором и счетом строк - https://www.mql5.com/ru/docs/files/filereadstring  Это сейчас вам нужна предпоследняя, потом и другие понадобятся.))

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

Evgeniy Zhdan
15386
Evgeniy Zhdan  
Yuriy Asaulenko:

Вы этот указатель никогда на последнюю строку не поставите, т.к. пока вы соберетесь туда его ставить, еще неск строк добавятся.) А когда начнете читать, то строка, может случиться, будет уже далеко не последней.

Ну они туда не со скоростью света добавляются. Цель - после октарытия ордера сразу поставить-потом прочитать, потом дописать в другой файл

Yuriy Asaulenko
9250
Yuriy Asaulenko  
Evgeniy Zhdan:

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

Я про считать байты с конца ничего не говорил.)

Yuriy Asaulenko
9250
Yuriy Asaulenko  
Evgeniy Zhdan:

Ну они туда не со скоростью света добавляются. Цель - после открытия ордера сразу поставить-потом прочитать, потом дописать в другой файл

Но конфликт вполне реален. Если 40 записей за 5 с.

Удалил часть текста. Подумал, что надо иметь более подробную инфу о задаче. Скажем, в рамках одно программы MQL описанная ТС конструкция выглядит совершенно бессмысленной.

Vladimir
1130
Vladimir  
Evgeniy Zhdan:

А можете развить свою мысль? Как эту строку прочитать с конца и поставить-таки указатель на начало последней строки, предпоследней. Перебор байтов в цикле с конца с целью проверить \n занимает длительное время, очень длительное.

Интересно, что такое нужное дело и нету стандартной какой-нибудь функции. Надо танцевать с бубном на углях.

Объявляем 2 строковые переменные S и SPred (раз Вам надо последнюю и предпоследнюю - две). Полагаем S="". Читаем файл с его начала построчно в S до конца файла. Перед каждым чтением заносим содержимое S в SPred. Когда чтение закончится, в SPred будет находиться предпоследняя, в S последняя строка. Возможно, надо отдельно обслужить случаи, когда всего строк было меньше 2 и меньше одной.

Или Вам требуются не сами строки, а смещения их начала в файле?

Alexey Viktorov
23814
Alexey Viktorov  

Может быть уже исправили, но не так давно я экспериментировал с перемещением указателя.

Получается такая фигня: в файлах .txt и .csv какие-то сбои шли и не получалось зная количество байт записи в строке переместить указатель куда надо. НО!!! в файле .bin всё чётко считается и указатель перемещается куда душе угодно.

Поэкспериментируйте сейчас как будет получаться. Считаем количество байт согласно документации, int 4 байта, double 8 байт если правильно помню и так далее... И от конца файла перемещать указатель на МИНУС байт...

123
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий