【发布时间】: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