Чтение из файла в массив

 

Помогите пожалуйста разобраться.

У меня есть файл csv с данными типа integer.

Как мне загрузить все данные из файла в массив?

 
 string FileName;  //- имя Вашего файла
n=0;
int FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,";"); 
if  (FileHandle<0)Alert("ОШИБКА ", GetLastError());                     
if  (FileHandle>0)                                                      
{ 
while(true)
{

      Mass1[n][0] =FileReadString(FileHandle); // 
             
      Mass1[n][1] =FileReadString(FileHandle); // 
      Mass1[n][2] =FileReadString(FileHandle); // 
      Mass1[n][3] =FileReadString(FileHandle); // 
      Mass1[n][4] =FileReadString(FileHandle); //
      Mass1[n][5] =FileReadString(FileHandle); // 
                
     ...и так далее по числу столбцов файла

//--------------------------------------------      
     if (FileIsLineEnding(FileHandle)==true)
     {
     n++;        
     }
     
     //--------------------------------------------
         
      if (FileIsEnding(FileHandle)==true)
      {  
      
      FileClose(FileHandle); 
     
      break;   
      } 
      
      } //while(true)

      } //if  (FileHandle>0) 
//-------------------------------------------------------------------------------- 




//                          Первая пустая строка массива
//+------------------------------------------------------------------------------+

int rows=0;
while(true)
{
if( Mass1[rows][0]!= "") rows++;
if( Mass1[rows][0]== "")break;

// rows - первая пустая строка массива
}
 
laanaa0708, спасибо. Неужели все так сложно. Буду разбираться.
 

Что-то я видимо не так делаю, компилятор ругается на скрипт 2;219;c:\Program Files\MetaTrader - Alpari_Test\experts\scripts\ReadFile_to_Array.mq4;18:19;'=' - incompatible types

Подскажите в чем я ошибся?

//+------------------------------------------------------------------+
//|                                            ReadFile_to_Array.mq4 |
//+------------------------------------------------------------------+
string FileName;
int FileHandle, n;
int Mass1[][8];

int ReadFile()
{
  FileName="Sell.csv"; // Имя файла
  n=0;
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,";"); 
  if  (FileHandle<0)Alert("ОШИБКА ", GetLastError());                     
  if  (FileHandle>0)                                                      
  { 
    while(true)
    {
      Mass1[n][0] =FileReadString(FileHandle); // 
      Mass1[n][1] =FileReadString(FileHandle); // 
      Mass1[n][2] =FileReadString(FileHandle); // 
      Mass1[n][3] =FileReadString(FileHandle); // 
      Mass1[n][4] =FileReadString(FileHandle); //
      Mass1[n][5] =FileReadString(FileHandle); // 
      Mass1[n][6] =FileReadString(FileHandle); // 
      Mass1[n][7] =FileReadString(FileHandle); // 
      //--------------------------------------------      
      if (FileIsLineEnding(FileHandle)==true) {n++;}
      //--------------------------------------------
      if (FileIsEnding(FileHandle)==true)
      {  
        FileClose(FileHandle); 
        break;   
      } 
    } //while(true)
  } //if  (FileHandle>0) 
//-------------------------------------------------------------------------------- 
//                          Первая пустая строка массива
//+------------------------------------------------------------------------------+
  int rows=0;
  while(true)
  {
    if( Mass1[rows][0]!= "") rows++;
    if( Mass1[rows][0]== "")break;
  }// rows - первая пустая строка массива
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
  ReadFile();
  return(0);
}
//+------------------------------------------------------------------+
Файлы:
files.rar  13 kb
 
Alfa писал(а) >>

Что-то я видимо не так делаю, компилятор ругается на скрипт 2;219;c:\Program Files\MetaTrader - Alpari_Test\experts\scripts\ReadFile_to_Array.mq4;18:19;'=' - incompatible types

Подскажите в чем я ошибся?

Нужно объявить размер массива и считывать FileReadNumber();
 
Vinin >>:
Нужно объявить размер массива и считывать FileReadNumber();

Прочитал про FileReadNumber, но  так и не понял как его использовать. Там в примере всего чтение одного значения.

А размер массива я вроде объявил. Только количество строк не задано изначально, я ведь не знаю сколько их будет. Надо наверное прочитать в csv файле количество строк и указывать в массиве такую же размерность. Но как тогда все это увязать с кодом laanaa0708, опять не понятно.

 
//+------------------------------------------------------------------+
//|                                            ReadFile_to_Array.mq4 |
//+------------------------------------------------------------------+
string FileName;
int FileHandle, n;
int Mass1[][8];
int Mass1Size=100;
int Mass1Step=5;

int ReadFile()
{
  ArrayResize(Mass1,Mass1Size);

  FileName="Sell.csv"; // Имя файла
  n=0;
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,";"); 
  if  (FileHandle<0)Alert("ОШИБКА ", GetLastError());                     
  if  (FileHandle>0)                                                      
  { 
    while(true)
    {
      Mass1[n][0] =FileReadNumber(FileHandle); // 
      Mass1[n][1] =FileReadNumber(FileHandle); // 
      Mass1[n][2] =FileReadNumber(FileHandle); // 
      Mass1[n][3] =FileReadNumber(FileHandle); // 
      Mass1[n][4] =FileReadNumber(FileHandle); //
      Mass1[n][5] =FileReadNumber(FileHandle); // 
      Mass1[n][6] =FileReadNumber(FileHandle); // 
      Mass1[n][7] =FileReadNumber(FileHandle); // 
      //--------------------------------------------      
      if (FileIsLineEnding(FileHandle)==true) {
        n++;
        if (n+Mass1Step>Mass1Size) {
           Mass1Size+=Mass1Step;
           ArrayResize(Mass1,Mass1Size);
        }
      }
      //--------------------------------------------
      if (FileIsEnding(FileHandle)==true)
      {  
        FileClose(FileHandle); 
        break;   
      } 
    } //while(true)
    ArrayResize(Mass1,n);
  } //if  (FileHandle>0) 
//-------------------------------------------------------------------------------- 
//                          Первая пустая строка массива
//+------------------------------------------------------------------------------+
  int rows=0;
  while(true)
  {
    if( Mass1[rows][0]!= "") rows++;
    if( Mass1[rows][0]== "")break;
  }// rows - первая пустая строка массива
}
//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
  ReadFile();
  return(0);
}
//+------------------------------------------------------------------+

Примерно так. На ошибки не проверял.

Код редактировал тут же.

 
Vinin, спасибо! Буду пробовать.
 

Что-то не так. Я для проверки выгрузил массив в файл и они совсем разные. Потерялся первый столбец, зато добавился в конец с 0. Строк почти в 10 раз стало меньше.

Пришлось закоментировать место про первую пустую строку, а токомпилятор выдавал ошибку

Вот код:

//+------------------------------------------------------------------+
//|                                            ReadFile_to_Array.mq4 |
//+------------------------------------------------------------------+

extern string FileName="Sell.csv"; // Имя файла
int FileHandle, n, stroki, i;
int Mass1[][8];
string curString;
int Mass1Size=100;
int Mass1Step=5;

int ReadFile()
{
  /*
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ,";");
  if (FileHandle==-1)   Print("Ошибка=",GetLastError());
  if (FileHandle>0)
  {
    while(!FileIsEnding(FileHandle))//Подсчитываю количество строк, для определения размерности массива
    {
      curString=FileReadString(FileHandle);
      if (FileIsLineEnding(FileHandle)) stroki++;
      if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle); break;} 
    }
    if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle);}
  }
  ArrayResize(Mass1,stroki); // Изменяю размерность массива под количество строк в файле
  */
  ArrayResize(Mass1,Mass1Size);

  n=0;
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,";"); 
  if  (FileHandle<0)Alert("ОШИБКА ", GetLastError());                     
  if  (FileHandle>0)                                                      
  { 
    while(true)
    {
      Mass1[n][0] =FileReadNumber(FileHandle); // 
      Mass1[n][1] =FileReadNumber(FileHandle); // 
      Mass1[n][2] =FileReadNumber(FileHandle); // 
      Mass1[n][3] =FileReadNumber(FileHandle); // 
      Mass1[n][4] =FileReadNumber(FileHandle); //
      Mass1[n][5] =FileReadNumber(FileHandle); // 
      Mass1[n][6] =FileReadNumber(FileHandle); // 
      Mass1[n][7] =FileReadNumber(FileHandle); // 
      //--------------------------------------------      
      if (FileIsLineEnding(FileHandle)==true) 
      {
        n++;
        if (n+Mass1Step>Mass1Size) {Mass1Size+=Mass1Step;ArrayResize(Mass1,Mass1Size);}
      }
      //--------------------------------------------
      if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle); break;} 
    } //while(true)
    //ArrayResize(Mass1,n);
  } //if  (FileHandle>0) 
//-------------------------------------------------------------------------------- 
//                          Первая пустая строка массива
//+------------------------------------------------------------------------------+
/*
  int rows=0;
  while(true)
  {
    if( Mass1[rows][0]!= "") rows++;
    if( Mass1[rows][0]== "")break;
  }// rows - первая пустая строка массива
*/
}
//----------------------------------------------------------WriteData_Sell
int WriteFileData_Sell()
{
   int m; m=ArrayRange(Mass1,0);// количество строк
   FileName="Sell_1.csv"; 
   FileHandle=FileOpen(FileName,FILE_WRITE | FILE_CSV,";");
   if (FileHandle<1) {Print("Не удалось открыть файл, ошибка ",GetLastError()); return;}   
   FileWrite(FileHandle); 
   for(i=0; i<m; i++) 
   {
     FileWrite(FileHandle,Mass1[i,0],Mass1[i,1],Mass1[i,2],Mass1[i,3],Mass1[i,4],Mass1[i,5],Mass1[i,6],Mass1[i,7],Mass1[i,8]);
   }
   Comment("Файл Sell записан");
  return(0);
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
  ReadFile();
  WriteFileData_Sell();
  return(0);
}
//+------------------------------------------------------------------+
 
//+------------------------------------------------------------------+
//|                                            ReadFile_to_Array.mq4 |
//+------------------------------------------------------------------+

extern string FileName="Sell.csv"; // Имя файла
int FileHandle, n, stroki, i;
int Mass1[][8];
string curString;
int Mass1Size=100;
int Mass1Step=5;

int ReadFile()
{
  /*
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ,";");
  if (FileHandle==-1)   Print("Ошибка=",GetLastError());
  if (FileHandle>0)
  {
    while(!FileIsEnding(FileHandle))//Подсчитываю количество строк, для определения размерности массива
    {
      curString=FileReadString(FileHandle);
      if (FileIsLineEnding(FileHandle)) stroki++;
      if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle); break;} 
    }
    if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle);}
  }
  ArrayResize(Mass1,stroki); // Изменяю размерность массива под количество строк в файле
  */
  ArrayResize(Mass1,Mass1Size);

  n=0;
  FileHandle=FileOpen(FileName, FILE_CSV|FILE_READ|FILE_WRITE,";"); 
  if  (FileHandle<0)Alert("ОШИБКА ", GetLastError());                     
  if  (FileHandle>0)                                                      
  { 
    while(true)
    {
      Mass1[n][0] =FileReadNumber(FileHandle); // 
      Mass1[n][1] =FileReadNumber(FileHandle); // 
      Mass1[n][2] =FileReadNumber(FileHandle); // 
      Mass1[n][3] =FileReadNumber(FileHandle); // 
      Mass1[n][4] =FileReadNumber(FileHandle); //
      Mass1[n][5] =FileReadNumber(FileHandle); // 
      Mass1[n][6] =FileReadNumber(FileHandle); // 
      Mass1[n][7] =FileReadNumber(FileHandle); // 
      //--------------------------------------------      
      n++;
      if (n+Mass1Step>Mass1Size) {Mass1Size+=Mass1Step;ArrayResize(Mass1,Mass1Size);}
      //--------------------------------------------
      if (FileIsEnding(FileHandle)==true) {FileClose(FileHandle); break;} 
    } //while(true)
    //ArrayResize(Mass1,n);
  } //if  (FileHandle>0) 
//-------------------------------------------------------------------------------- 
//                          Первая пустая строка массива
//+------------------------------------------------------------------------------+
/*
  int rows=0;
  while(true)
  {
    if( Mass1[rows][0]!= "") rows++;
    if( Mass1[rows][0]== "")break;
  }// rows - первая пустая строка массива
*/
}
//----------------------------------------------------------WriteData_Sell
int WriteFileData_Sell()
{
   int m; m=ArrayRange(Mass1,0);// количество строк
   FileName="Sell_1.csv"; 
   FileHandle=FileOpen(FileName,FILE_WRITE | FILE_CSV,";");
   if (FileHandle<1) {Print("Не удалось открыть файл, ошибка ",GetLastError()); return;}   
   FileWrite(FileHandle); 
   for(i=0; i<m; i++) 
   {
     FileWrite(FileHandle,Mass1[i,0],Mass1[i,1],Mass1[i,2],Mass1[i,3],Mass1[i,4],Mass1[i,5],Mass1[i,6],Mass1[i,7],Mass1[i,8]);
   }
   Comment("Файл Sell записан");
  return(0);
}

//+------------------------------------------------------------------+
//| script program start function                                    |
//+------------------------------------------------------------------+
int start()
{
  ReadFile();
  WriteFileData_Sell();
  return(0);
}
//+------------------------------------------------------------------+
 
Vinin >>:

Что-то получился совсем коротенький файл с 0.

Буду разбираться. Может через бинарный файл проще?

По идее мне нужно, чтобы скрипт записал в файл вычисленный массив (вычисления долгие - около суток). Далее эксперт при инициализации из файла создает массив и с ним работает.

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

Причина обращения: