数据库表的导入和导出

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 标志。如果存在此标志,所有输出字符串都将用双引号括起来,并且如果字符串包含双引号,它将被替换为两个双引号。

该函数返回导出的记录数,如果出错则返回负值。