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 - первая пустая строка массива }
Что-то я видимо не так делаю, компилятор ругается на скрипт 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); } //+------------------------------------------------------------------+
Прочитал про 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); } //+------------------------------------------------------------------+
Примерно так. На ошибки не проверял.
Код редактировал тут же.
Что-то не так. Я для проверки выгрузил массив в файл и они совсем разные. Потерялся первый столбец, зато добавился в конец с 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); } //+------------------------------------------------------------------+
Что-то получился совсем коротенький файл с 0.
Буду разбираться. Может через бинарный файл проще?
По идее мне нужно, чтобы скрипт записал в файл вычисленный массив (вычисления долгие - около суток). Далее эксперт при инициализации из файла создает массив и с ним работает.
Поэтому и нужен промежуточный файл, если в эксперт запихнуть такие вычисления массива, то будет плохо.
![MQL5 - Язык торговых стратегий для клиентского терминала MetaTrader 5](https://c.mql5.com/i/registerlandings/logo-2.png)
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Помогите пожалуйста разобраться.
У меня есть файл csv с данными типа integer.
Как мне загрузить все данные из файла в массив?