Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Вся деятельность участников MQL5.community. Заходи в раздел Стена!
Anton
52
Anton 2013.08.31 19:41 

Добрый вечер форумчане! Вопрос к опытным в файловых операциях с массивами. Столкнулся со сложностью сохранения данных в двоичный массив из файла csv. Имеется файл с помещенными в него данными шириной в 4 колонки: валюта (string), цена (double), колонка (int) и колонка (int). Каждое значение в отдельной колонке (здесь для наглядности разделил "/" ). Высота колонок неопределенная. Пример:

EURUSD/1.3200/1/1

GBPUSD/1.5400/5/1

.... и т.д. вниз

Задача считать данные в двоичный массив. Если считывать в таком виде в одномерный, то все ок. Но в виде двоичного ничего не выходит. В приведенном ниже варианте читает только последнюю колонку. Если сменить разделитель на ";", то читает всю строку за раз... В чем здесь у меня ошибка и какие варианты решения существуют? Буду рад оказанной помощи.

string Mass1[][4];


int init()
  {
//----
   return(0);
  }

int deinit()
  {
//---- 
 
//----
   return(0);
  }


int start()
  {
 
//-------
int i; 


 
   string FileName= "тест.csv";

   int FileHandle = FileOpen(FileName,FILE_CSV|FILE_READ,","); 

   if(FileHandle<0 )
   {
     Print("Ошибка "+GetLastError()); 
     return(0);
   } 


   if(FileHandle>0) 
   {
    //---
           while(true)
           {
               Mass1[i][0] =FileReadString (FileHandle);
               Mass1[i][1] =FileReadString (FileHandle);
               Mass1[i][2] =FileReadString (FileHandle);  
               Mass1[i][3] =FileReadString (FileHandle); 
           
               Print( Mass1[i][0]+" "+Mass1[i][1]+" "+Mass1[i][2]+" "+Mass1[i][3]);     
               
    
               if (FileIsLineEnding(FileHandle)==true)
               {
                 i++; 
               }
               if (FileIsEnding(FileHandle)==true )
               {  
                  FileClose(FileHandle);
                  break;   
               } 
           }
    //--- 
   }


//-------
   return(0);
  }
o_O
Модератор
23316
o_O 2013.08.31 19:45  

банальщина

где ArrayResize ?

Murad Ismayilov
1816
Murad Ismayilov 2013.09.01 08:12  

Вот моя реализация. Можете сравнить и использовать

//
// Глобальные переменные
//

int HistoryBars;
datetime HistoryTime[];
double HistoryClose[];

//+------------------------------------------------------------------+
//| Загрузка истории котировок из файла                              |
//| Глобальные переменные HistoryBars, HistoryTime, HistoryClose     |
//+------------------------------------------------------------------+
void WmLoadHistoryFromCsvFile(string filename) {
  HistoryBars = -1;
  int handleCsv = FileOpen(filename, FILE_CSV | FILE_READ, ',');
  if (handleCsv < 1) {
    Print("File ",  filename, ", the last error is '", ErrorDescription(GetLastError()), "'");
    return;
  }
  
  HistoryBars = 0;
  while (!FileIsEnding(handleCsv)) {
    FileReadString(handleCsv);
    HistoryBars++;     
  }
  
  HistoryBars /= 7;
  
  ArrayResize(HistoryTime, HistoryBars);
  ArrayResize(HistoryClose, HistoryBars);
  
  FileSeek(handleCsv, 0, SEEK_SET);
  for (int index = (HistoryBars - 1); index >= 0; index--) {
    string csvDate = FileReadString(handleCsv);
    string csvTime = FileReadString(handleCsv);
    HistoryTime[index] = StrToTime(csvDate + " " + csvTime);
    string csvOpen = FileReadString(handleCsv);
    string csvHigh = FileReadString(handleCsv);
    string csvLow = FileReadString(handleCsv);
    string csvClose = FileReadString(handleCsv);
    HistoryClose[index] = StrToDouble(csvLow);
    string csvVolume = FileReadString(handleCsv);
  }
  
  FileClose(handleCsv);
}
Anton
52
Anton 2013.09.01 14:23  

Все. Решил с вашей помощью свою проблему! Спасибо всем!

п.с. Я не программист. С двоичными никогда не сталкивался.

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