【问题标题】:Efficiently reading csv file in MQL4?在 MQL4 中高效读取 csv 文件?
【发布时间】:2021-03-25 19:11:38
【问题描述】:

我将“AAPL.csv”放入 MetaTrader 终端文件夹的文件子文件夹 (MQL4/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);
  }

【问题讨论】:

    标签: csv mql4 metatrader4


    【解决方案1】:

    您应该将数组的第一个维度用于行,将第二个维度用于列。因此,您将有一个 string s[1][7];

    的数组语句

    然后,您可以在循环读取 csv 文件时调整数组的大小,如下所示:

    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);
    }
    

    您不能调整多维数组的第二维大小。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-21
      • 1970-01-01
      • 2021-10-30
      • 1970-01-01
      • 2020-06-29
      • 2021-07-03
      • 1970-01-01
      相关资源
      最近更新 更多