跳转到主要内容
我们经常需要处理自定义文本格式的数据,比如非标准格式、无效的 JSON,或损坏的 CSV。对于这类情况,CSV 或 JSON 这类标准 parser 并不总是适用。不过,ClickHouse 提供了强大的 Template 和 Regex 格式来应对这些需求。

根据模板导入

假设我们要从以下日志文件导入数据:
我们可以使用 Template 格式导入这些数据。我们需要定义一个模板字符串,为输入数据的每一行设置值占位符:
先创建一个表,用于导入数据:
要使用指定模板导入数据,我们需要先将模板字符串保存到文件中 (本例中为 row.template) :
我们使用 ${name:escaping} 格式来定义列名和转义规则。这里有多种可选项,如 CSV、JSON、Escaped 或 Quoted,它们分别实现了对应的转义规则 现在,在导入数据时,我们可以将给定文件作为 format_template_row Settings 选项的参数 (注意,template 和 data files 不应 在文件末尾额外带有 \n 符号) :
我们可以确认数据已加载到表中:

跳过空白符

可考虑使用 TemplateIgnoreSpaces,它支持跳过模板中分隔符之间的空白符:

使用 Template 导出数据

我们还可以使用 Template 将数据导出为任意文本格式。在这种情况下,需要创建两个文件: 结果集模板,它定义了整个结果集的布局:
这里,rows_readtime 是每个请求都可用的系统指标。data 表示根据 行模板文件 中定义的模板生成的行 (在此文件中,${data} 必须始终作为第一个占位符出现) :
接下来,使用这些模板导出以下查询:

导出为 HTML 文件

基于 Template 的结果也可以通过 INTO OUTFILE 子句导出到文件中。下面让我们基于给定的 resultset 格式生成 HTML 文件:

导出为 XML

Template 格式可用于生成几乎任何文本格式的文件,包括 XML。只需提供相应的模板并执行导出即可。 你也可以考虑使用 XML 格式,以获得包含元数据的标准 XML 结果:

基于正则表达式导入数据

Regexp 格式适用于更复杂的场景,即需要以更复杂的方式解析输入数据。下面继续解析示例文件 error.log,但这次会捕获文件名和协议,并将它们分别保存到单独的列中。首先,为此准备一个新表:
现在我们可以按正则表达式导入数据:
ClickHouse 会根据各个捕获组的顺序,将数据插入相应的列中。我们来检查一下数据:
默认情况下,遇到不匹配的行时,ClickHouse 会报错。如果你想改为跳过不匹配的行,可以启用 format_regexp_skip_unmatched 选项:

其他格式

ClickHouse 支持多种格式,包括文本格式和二进制格式,以适用于各种场景和平台。你可以在以下文章中进一步了解更多格式及其使用方法: 此外,还可以查看 clickhouse-local —— 这是一款功能完整且便携的工具,可直接处理本地/远程文件,而无需 ClickHouse server。
最后修改于 2026年6月10日