Любой вопрос новичка, чтоб не захламлять форум. Профи, не проходите мимо. Без вас никуда - 6. - страница 1116

 
Top2n:

Доброе время, как добавить новую строчку в готовый файл.csv, со сдвигом в 1ую строку - если можно? Ну или как то по другому, но без пересчета/перебора существующих данных. Разве что допускается обновление наименования столбцов и строк 

int GenerateCsv(string fileName)
  {
   int handle= FileOpen(fileName,FILE_CSV|FILE_WRITE," "),x=0,y=0; 

FILE_CSV убрать, вместо использовать FILE_ANSI если юзаеш формат "\n\t" и тд.

 
alexsis78:

FILE_CSV убрать, вместо использовать FILE_ANSI если юзаеш формат "\n\t" и тд.

А мне нужно через FileReadArray что б добавлять по новой строчке при новом баре
 
Top2n:
Доброго времени, задача переписать двумерный массив, в формат BIN, распознает ли функция на вход двумерный массив?

FileWriteArray

Или только отдельно по строчкам записывать?
Конечно прочтёт как двухмерный. Извини, не в обиду... а не проще было тестовый массив из 2х2 элемента записать, прочесть и посмотреть?
 
Alexey Viktorov:
Конечно прочтёт как двухмерный. Извини, не в обиду... а не проще было тестовый массив из 2х2 элемента записать, прочесть и посмотреть?

В фаил записываются пустые значения NULLarrayZ двумерный

//+------------------------------------------------------------------+
//| Запись n элементов массива в файл                                |
//+------------------------------------------------------------------+
void WriteData(const int n)
  {
//--- откроем файл
   ResetLastError();
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //--- запишем данные массива в конец файла
      FileSeek(handle,0,SEEK_END);
      FileWriteArray(handle,arrayZ,0,n);
      //--- закрываем файл
      FileClose(handle);
     }
   else
      Print("Failed to open the file, error ",GetLastError());
  }
Если же запускаю в запись одномерный, то в bin появляются иероглифы,  двумерный распознает как NULL одномерный что то записал
 
Top2n:

В фаил записываются пустые значения NULL. arrayZ двумерный

//+------------------------------------------------------------------+
//| Запись n элементов массива в файл                                |
//+------------------------------------------------------------------+
void WriteData(const int n)
  {
//--- откроем файл
   ResetLastError();
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //--- запишем данные массива в конец файла
      FileSeek(handle,0,SEEK_END);
      FileWriteArray(handle,arrayZ,0,n);
      //--- закрываем файл
      FileClose(handle);
     }
   else
      Print("Failed to open the file, error ",GetLastError());
  }

Что-то мне сегодня лениво да и некогда... В документации, откуда ты содрал эту функцию, вообще записывают даже массив структур. А работает-ли весь пример приведённый в документации если его не менять? Проверь сам, если не работает надо писать в СД.

 
Не юзайте заточки типа FileWriteArray и FileReadArray для тех целей, для которых они не предназначены. 
Это функции сериализации. Если вы хотите открывать файл текстовім читабельным форматом - пишите в файл стринги.
string s = StringFormat("первая строка: %s\n", first);
s += StringFormat("вторая строка: %s\n", second);
s += StringFormat("третяя строка: %s\n", third);
FileWrite(s);
и так далее и тому подобное.
Для чтения FileRead и парсить каждый лайн (поиграть надо, но куда денешься если хочешь читабельности).
Как дети, ей Богу. Ждать от функи роджественского чуда, типа, само все сделает красиво накидает и отформатирует ))) 
А вообще, с Рождеством, всем профита )))
 
alexsis78:
Не юзайте заточки типа FileWriteArray и FileReadArray для тех целей, для которых они не предназначены. 
Это функции сериализации. Если вы хотите открывать файл текстовім читабельным форматом - пишите в файл стринги.
string s = StringFormat("первая строка: %s\n", first);
s += StringFormat("вторая строка: %s\n", second);
s += StringFormat("третяя строка: %s\n", third);
FileWrite(s);
и так далее и тому подобное.
Для чтения FileRead и парсить каждый лайн (поиграть надо, но куда денешься если хочешь читабельности).
Как дети, ей Богу. Ждать от функи роджественского чуда, типа, само все сделает красиво накидает и отформатирует ))) 
А вообще, с Рождеством, всем профита )))
Сериализация вполне подойдет, массив огромный. А читабельный формат пока на первых порах, для проверки верности заполнения.
 

Подскажите можно ли обойти импорт двух мерного массива из csv., путем извлечения трех(или двух) мерного массива из индикатора в советник? 

C считает ли файловая операция FileReadDouble Двумерный массив, если да то каким образом?

И вообще через какую операцию лучше перевести csv матрицу в массив.

Вообще не понимаю как, вот например взять пример

ArrayResize(time_buff,size);
      //--- прочитаем данные из файла
      for(int i=0;i<size;i++)
        {
         time_buff[i]=(datetime)FileReadDouble(file_handle);
         ma_buff[i]=FileReadDouble(file_handle);
        }

 как это так, записываем одни и те же данные в массив time_buff[i]и ma_buff[i] 

пример из https://www.mql5.com/ru/docs/files/filereaddouble

А если у меня двух мерный массив то как мне перебор устроить. 

Если использовать FileReadString, то там нужно указать длину строки, это типо надо знать количество цифр в страке, не ячеек а цифр?

По всей видимости надо использовать FileReadNumber но тоже это жесть какая та 

Документация по MQL5: Файловые операции / FileReadDouble
Документация по MQL5: Файловые операции / FileReadDouble
  • www.mql5.com
Файловые операции / FileReadDouble - справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
Top2n:

Подскажите можно ли обойти импорт двух мерного массива из csv., путем извлечения трех(или двух) мерного массива из индикатора в советник? 

C считает ли файловая операция FileReadDouble Двумерный массив, если да то каким образом?

И вообще через какую операцию лучше перевести csv матрицу в массив.

Вообще не понимаю как, вот например взять пример

ArrayResize(time_buff,size);
      //--- прочитаем данные из файла
      for(int i=0;i<size;i++)
        {
         time_buff[i]=(datetime)FileReadDouble(file_handle);
         ma_buff[i]=FileReadDouble(file_handle);
        }

 как это так, записываем одни и те же данные в массив time_buff[i]и ma_buff[i] 

пример из https://www.mql5.com/ru/docs/files/filereaddouble

А если у меня двух мерный массив то как мне перебор устроить. 

Если использовать FileReadString, то там нужно указать длину строки, это типо надо знать количество цифр в страке, не ячеек а цифр?

По всей видимости надо использовать FileReadNumber но тоже это жесть какая та 

А скажи пожалуйста, когда мы говорили о записи массива FileWriteArray() ты как пытался прочесть записанное?
 
Alexey Viktorov:
А скажи пожалуйста, когда мы говорили о записи массива FileWriteArray() ты как пытался прочесть записанное?

//--- путь к файлу
   string path=InpDirectoryName+"//"+InpFileName;
//--- откроем файл
   ResetLastError();
   int file_handle=FileOpen(path,FILE_READ|FILE_BIN);
   if(file_handle!=INVALID_HANDLE)
     {
      //--- прочитаем все данные из файла в массив
      FileReadArray(file_handle,arr);
      //--- получим размер массива
      int size=ArraySize(arr);
      //--- распечатаем данные из массива
         Print(" = ",arr[0][0]," = ",arr[1][1]," = ",arr[2][2]);
      Print("Total data = ",size);
      //--- закрываем файл
      FileClose(file_handle);
     }
   else
      Print("File open failed, error ",GetLastError());
2017.01.09 17:20:40.609 TorFid_v02 (EURUSD,H1)  = 0.0  = 0.0  = 0.0
2017.01.09 17:20:40.609 TorFid_v02 (EURUSD,H1)  Total data = 1020100

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

Если конечно я сохранил правильно 

for(int z=1; z<=ARRAY_SIZE_Y; z++) // Перебор по барам, колонка Y
        {
         for(int q=1; q<ARRAY_SIZE_X-1; q++) // Перебор по периоду, колонка X
           {
            arr[q][z]=NormalizeDouble(sm.d[q+1].m[nBar-z],5);                // M(I) SMA
           }
        }
      WriteData(1000);
//+------------------------------------------------------------------+
//| Запись n элементов массива в файл                                |
//+------------------------------------------------------------------+
void WriteData(const int n)
  {
//--- откроем файл
   ResetLastError();
   int handle=FileOpen(path,FILE_READ|FILE_WRITE|FILE_BIN);
   if(handle!=INVALID_HANDLE)
     {
      //--- запишем данные массива в конец файла
      FileSeek(handle,0,SEEK_END);
      FileWriteArray(handle,arr,0,n);
      //--- закрываем файл
      FileClose(handle);
     }
   else
      Print("Failed to open the file, error ",GetLastError());
  }