在MQL4中有效阅读csv文件?

nvbavucw  于 2023-07-31  发布在  其他
关注(0)|答案(1)|浏览(120)

我将“AAPL.csv”放入MetaTrader终端文件夹的Files子文件夹(MQL 4/Files),以便EA访问。此csv的结构如下:

Date,Open,High,Low,Close,Adj Close,Volume
1980-12-12,0.1283479928970337,0.1289059966802597,0.1283479928970337,0.1283479928970337,0.10092189908027649,469033600
1980-12-15,0.12221000343561172,0.12221000343561172,0.12165199965238571,0.12165199965238571,0.09565676748752594,175884800

字符串
我想读这个,以及许多其他类似的csv文件。所有文件都有不同的长度。我的问题是,阅读可变长度文件的最佳实践是什么?现在,我通过创建一个二维数组来读取文件的内容:

string s[7][1000000];


虽然这是一个糟糕的编程(如果文件只有500行呢?),如果遇到更长的csv,它仍然会失败(如果文件有1000001行呢?)。我尝试使用动态数组:

string s[7][];


但它返回'[' - invalid index value错误。另一个想法是我必须使用FileSize()函数并为二维数组分配所需的内存量。然而,在这方面,

int handle=FileOpen(FileName,FILE_CSV|FILE_READ,",");  
if(handle>0)      
{        
   int size = FileSize(handle);      
...


产生的大小等于列号和行号的乘积。我希望获得row_count和col_count并使用它们来定义s:

string s[col_count][row_count];


完整的工作代码:

extern string FileName = "AAPL.csv";

int init()
  {
   int row=0,col=0;
   string s[7][1000000]; 

   ResetLastError();
   int handle=FileOpen(FileName,FILE_CSV|FILE_READ,",");
   if(handle>0)
      {
        while(True)
        {
          string temp = FileReadString(handle);
          if(FileIsEnding(handle)) break; //FileIsEnding = End of File
          s[col][row]=temp;
          if(FileIsLineEnding(handle)) //FileIsLineEnding = End of Line
          {
            col = 0; //reset col = 0 for the next row
            row++; //next row
          }
          else
          {
            col++; //next col of the same row
          }
        }
        FileClose(handle);
      }
      else
      {
        Comment("File "+FileName+" not found, the last error is ", GetLastError());
      }  
   return(0);
  }

int start()
  {
   return(0);
  }

nszi6y05

nszi6y051#

您应该将数组的第一个维度用于行,第二个维度用于列。因此,您将拥有string s[1][7];的数组语句
然后,您可以在循环阅读csv文件时调整数组大小,如下所示:

string s[1][7];

int handle=FileOpen(FileName,FILE_CSV|FILE_READ,",");
if(handle==INVALID_HANDLE) Print("Error opening file ",GetLastError());
else
{
   int row=0;
   while(!FileIsEnding(handle))
   {
      if(row>0) ArrayResize(s,row+1);
      //carry out array reading here
      //eg s[row][0]=FileReadString(handle);
      //eg s[row][1]=FileReadString(handle);
      //etc
      row++;
   }
   FileClose(handle);
}

字符串
不能调整多维数组第二维的大小。

相关问题