数据库表的导入和导出
MQL5 允许将单个数据库表导出到 CSV 文件或从 CSV 文件导入。不提供将整个数据库作为带有 SQL 命令的文件进行导出/导入的功能。
long DatabaseImport(int database, const string table, const string filename, uint flags,
const string separator, ulong skip_rows, const string comment_chars)
DatabaseImport 函数将指定文件中的数据导入到表中。前两个参数给出了打开的数据库描述符和表名。
如果名为 table 的表不存在,它将自动创建。表中字段的名称和类型将根据文件中包含的数据自动识别。
导入的文件不仅可以是现成的 CSV 文件,还可以是包含 CSV 文件的 ZIP 存档。filename 可能包含路径。将相对于 MQL5/Files 目录搜索文件。
ENUM_DATABASE_IMPORT_FLAGS 枚举中描述了可以按位组合的有效标志:
- DATABASE_IMPORT_HEADER 第一行包含表字段的名称
- DATABASE_IMPORT_CRLF 对于换行符,使用 CRLF 字符序列
- DATABASE_IMPORT_APPEND 将数据添加到现有表中
- DATABASE_IMPORT_QUOTED_STRINGS 字符串值在双引号内
- DATABASE_IMPORT_COMMON_FOLDER 终端的公共文件夹
separator 参数设置 CSV 文件中的分隔符字符。
skip_rows 参数可跳过文件中指定数量的前导行。
comment_chars 参数包含文件中用作注释标志的字符。以这些字符中任何一个开头的行都将被视作注释并且不会被导入。
函数返回导入的行数,如果出错则返回 -1。
long DatabaseExport(int database, const string table_or_sql, const string filename, uint flags, const string separator)
DatabaseExport 函数将表或 SQL 查询的结果导出到 CSV 文件。数据库句柄以及表名或查询文本在前两个参数中指定。
如果导出查询结果,则 SQL 查询必须以 "SELECT" 或 "select" 开头。换句话说,SQL 查询不能更改数据库状态;否则,DatabaseExport 将以错误结束。
文件名 filename 可能包含当前终端实例 MQL5/Files 目录内的路径,或终端的共享文件夹,具体取决于标志。
flags 参数用于指定控制文件格式和位置的标志组合。
- DATABASE_EXPORT_HEADER 输出带有字段名称的字符串
- DATABASE_EXPORT_INDEX 显示行号
- DATABASE_EXPORT_NO_BOM 不在文件开头插入标签 BOM (默认情况下会插入 BOM)
- DATABASE_EXPORT_CRLF 使用 CRLF 换行(默认为 LF)
- DATABASE_EXPORT_APPEND 将数据附加到现有文件的末尾(默认情况下,文件会被覆盖),如果文件不存在,则创建
- DATABASE_EXPORT_QUOTED_STRINGS 以双引号输出字符串值
- DATABASE_EXPORT_COMMON_FOLDER CSV 文件将创建在所有终端的公共文件夹中 MetaQuotes/Terminal/Common/File
separator 参数指定列分隔符字符。如果为 NULL,则将使用制表符 '\t' 作为分隔符。空字符串 "" 被认为是有效的分隔符,但生成的 CSV 文件无法作为表读取,它将是一组行。
数据库中的文本字段可能包含换行符('\r' 或 '\r\n')以及在 separator 参数中指定的分隔符字符。在这种情况下,必须在 flags 参数中使用 DATABASE_EXPORT_QUOTED_STRINGS 标志。如果存在此标志,所有输出字符串都将用双引号括起来,并且如果字符串包含双引号,它将被替换为两个双引号。
该函数返回导出的记录数,如果出错则返回负值。