我将“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);
}
型
1条答案
按热度按时间nszi6y051#
您应该将数组的第一个维度用于行,第二个维度用于列。因此,您将拥有
string s[1][7];
的数组语句然后,您可以在循环阅读csv文件时调整数组大小,如下所示:
字符串
不能调整多维数组第二维的大小。