Как прочитать файл CSV С конца и заполнить массив скажем на 10 значений - страница 2

 
Yuriy Asaulenko:

Угу, весь файл читать. Медленнее не придумаешь. Оч. дорого.

Согласен, недостаток есть. Если файл большой. Можно с конца читать, но уже работать с байтами

 
Весь файл можно только первый раз читать. При этом запомнить позицию 10-й с конца строки, при следующем прочтении с нее начинать. Тут кольцевой массив пригодится.
 
Evgeniy Zhdan:

Согласен, недостаток есть. Если файл большой. Можно с конца читать, но уже работать с байтами

Что и предлагаю. Прочитать чуть больше последней строки. В общем случае, если нужно неск строк, то все аналогично.

У меня сейчас CSV 55 тыщ строк. Вот как прочитать последние 5 строк? L=l*5. Скажем l=~200 байт в строке. Передвигаем от конца на 1100 байт и читаем до конца файла.

 
Yuriy Asaulenko:

Что и предлагаю. Прочитать чуть больше последней строки. В общем случае, если нужно неск строк, то все аналогично.

У меня сейчас CSV 55 тыщ строк. Вот как прочитать последние 5 строк? L=l*5. Скажем ~200 байт в строке. Передвигаем от конца на 1100 байт и читаем до конца файла.

Да, отличный вариант. Полностью согласен.

Тогда моем коде просто поменять куда ставить курсор

     //Читаем из файла 
         FileSeek(filehandleZ,-1,SEEK_SET); //вот тут поменять типа  FileSeek(filehandleZ,-1000(примерно),SEEK_END)


         string Slast;
         string Spred;

         while(FileIsEnding(filehandleZ)==false) // До тех пор, пока файловый указатель не в конце файла
           {     
            Spred=Slast;
            Slast=FileReadString(filehandleZ);
           }
 
Evgeniy Zhdan:

Да, отличный вариант. Полностью согласен.

А если в строках не по 200 символов а от 4 до 15 ? 

 
Dmitiry Ananiev:

А если в строках не по 200 символов а от 4 до 15 ? 

 UTF-8 может иметь либо 2, либо 3 байта на символ Unicode - так говорит гугл.

Исходя из этого посчитать. Тут же примерно надо посчитать, с точностью до байта нафик не надо. Лучше с запасом

 
Dmitiry Ananiev:

А если в строках не по 200 символов а от 4 до 15 ? 

Берем, что строка 15 символов. Но это еще не байты.) Кстати, прочитать в один прием лишние 1-2 тыщ байтов, быстрее чем файл перебирать. А спарсить - это вообще минимум ресурсов.

 
Dmitiry Ananiev:

А если в строках не по 200 символов а от 4 до 15 ? 

перед записью приводите строку к одному количеству символов. К примеру 0001.00, 0215.00 и 1374.01 совершенно идентичны по количеству символов. И при переводе в StringToDouble проблем не возникнет. Тогда будете точно знать количество символов в строке.

 
Konstantin Nikitin:

перед записью приводите строку к одному количеству символов. К примеру 0001.00, 0215.00 и 1374.01 совершенно идентичны по количеству символов. И при переводе в StringToDouble проблем не возникнет. Тогда будете точно знать количество символов в строке.

'12.00000000' и '1.08090000', или '7', '15' и '154' количество символов в строке разное. Хотя проблем при конвертации тоже не возникнет. B в CSV такое сплошь и рядом.

 
Dmitiry Ananiev:

Размер строк разный. 
Может кто сталкивался с изящным и экономным решением ? 

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql5, тонкости и приёмы работы

fxsaber, 2018.04.06 17:08

// Заполнение массива строками из файла - альтернатива
int FileToStrings2( const string FileName, string &Str[] )
{
  uchar Bytes[];
  
  return(FileLoad(FileName, Bytes) ? StringSplit(CharArrayToString(Bytes), '\n', Str) : 0);
}

Форум по трейдингу, автоматическим торговым системам и тестированию торговых стратегий

Особенности языка mql4, тонкости и приёмы работы

fxsaber, 2018.01.30 14:51

MT5-функции для кроссплатформенности
// https://www.mql5.com/ru/docs/files/fileload
template <typename T>
long FileLoad( const string FileName, T &Buffer[], const int CommonFlag = 0 )
{
  long Res = -1;
  const int handle = FileOpen(FileName, FILE_READ | FILE_BIN | CommonFlag);
  
  if (handle != INVALID_HANDLE)
  {
    if (!(Res = FileReadArray(handle, Buffer)))
      Res = -1;
    
    FileClose(handle);
  }
  
  return(Res);  
}