Query Streams 是一个安全的实时数据库集成平台,其多记录 CSV 连接器可以读取所有普通 CSV 工具都无法读取的奇怪机器导出文件——这些文件的每一行都以记录类型标签开头,并且每个标签都有自己的列。 了解更多信息,请访问 QueryStreams.com 和 免费注册 将其指向您的第一个导出文件夹。
大多数拥有这类文件的人并不知道这种格式有名称。他们只知道它是随文件一起提供的。 .csv 扩展名显示,用电子表格打开后会生成无法读取的内容,而且他们尝试的所有工具要么直接失败,要么悄无声息地损坏文件。因此,文件只能手动处理,或者用几年前某人编写的、没人愿意碰的脚本来处理。
导致所有 CSV 工具崩溃的文件
这就是表格的形状。请注意,它没有标题行,而且列数每行都在变化。
HDR,2026-08-24,MC-07,v2.1 ORD,A-10021,ACME Joinery,2026-08-26 ITM,A-10021,门板 18mm,4,62.50 ITM,A-10021,封边条 22mm,12,3.20 ORD,A-10022,Bramble Interiors,2026-08-27 ITM,A-10022,搁板 15mm,20,18.75 TRL,2,3,412.90
每行的第一个字段不是数据,而是一个 记录类型标签并解释了该行其余部分的含义。 HDR 是包含导出日期、机器标识符和格式版本的文件头。 奥德 订单包含参考编号、客户和交货日期。 ITM 这是一个包含数量和单价的行项目,因此它有五个字段: 奥德 有四个。 TRL 这是一个装有计数和总数的拖车,以便接收系统可以检查运输过程中是否有货物丢失。
这是 记录类型 CSV这种格式有时被称为混合记录 CSV 或 EDI 风格 CSV。它常见于一些早于文件形状为矩形的领域:例如木工和制造机械、仓库管理系统、银行对账单格式、货运和海关信息交换,以及在平面文件(带有文字行)是一次性传输整个文档的显而易见的方式时编写的业务线软件。
所有普通的 CSV 工具都会在第一行就失败,原因都一样。Microsoft Excel、Power Query 和 Python 都无法处理这种情况。 读取 CSV 调用和数据库批量加载器都假定每个文件只有一个头部和一个形状。如果一个文件包含四个形状,最好的情况是立即出现列数错误;最坏的情况是生成一个包含四个形状的表。 62.50 被列入客户名单中,一个月都没人注意到。
每个记录标签对应一个表格
查询流不会强制将文件内容放入同一个表中。它会读取标签,并为每个标签创建一个单独的表,每个表都有自己的列。四个标签对应四个表,每个表都是一个标准的、结构良好的 SQL 表,您可以直接查询,而无需考虑它来自哪个文件。
字段计数不包括标签本身。
文件夹中的每个文件都会同时提供给这四个文件。
文件夹机制与其他所有文件集连接器相同,具体描述见下文。 如何使用 SQL 查询文件夹中的文件代理程序扫描文件夹,抽取最多 64 个文件作为样本,标记找到的内容,然后只读取更改的部分。区别在于标记的内容。连接器引脚不再定义单个表,而是标记多个表。 每个标签一个表定义每个元素都带有它所属的标签以及该标签的一行必须包含的字段数。
| 文件标签 | 您查询的表 | 每行原始字段 | 数据列 |
|---|---|---|---|
HDR | 数据头 | 4 | 字段1 – 字段 3 |
奥德 | 数据顺序 | 4 | 字段1 – 字段 3 |
ITM | 数据项 | 5 | 字段1 – 字段4 |
TRL | 数据_trl | 4 | 字段1 – 字段 3 |
类型是根据采样数据,按标签和位置计算出来的,使用一个故意设置得很小的阶梯:整数变为 大情报小数变成了精确值 十进制 而不是浮点数,这样资金就不会出现波动。 2026-08-24 成为一个 日期一个带有时间的日期就变成了 时间戳其他任何内容都保留为文本。空字段显示为: 无效的.
表名来源
表格名为 数据_ 标签后跟小写字母,除字母和数字以外的任何内容都用下划线表示,字母和数字之间的连接处也用下划线连接。最后这条规则对于机器格式至关重要,因为机器格式通常使用编号标签:例如,Homag 面板导出标签。 PNLHDR1, PNL1, PNL2 和 PNL3 生产 数据_pnlhdr_1, 数据_pnl_1, 数据_pnl_2 和 data_pnl_3这样在查询中比使用原始标签要好得多。
这 数据_ 前缀是固定的,所以这张卡没有 表名 字段:名称必须来自已固定的清单文件,因为只有清单文件才知道文件夹实际包含哪些标签。您无法选择前缀,因此请针对此字段编写已保存的查询。 数据顺序 而不是期待拥有一个属于自己的名字。
如果两个不同的标签会生成相同的表名,连接器会拒绝绑定,而是会同时命名这两个标签,而不是将它们合并。这种将机器刻意分开的两种记录类型悄悄合并的做法,正是那种看起来正确的错误答案。
重新加入组的序列列
将一个文件拆分成四个表只是完成了一半的工作。文件中的记录是相互关联的,这种关联必须在拆分后仍然存在,否则你只是用一个无法使用的文件换来了四个互不关联的文件。
因此,每个表都有一个名为“列”的列。 _seq它的定义非常精确,值得仔细阅读两遍: _seq 是该文件中该标签的从零开始的出现索引第一个 ITM 文件中的一行有 _seq = 0第二个有 _seq = 1以此类推,每个标签单独计数。
这就是重复组格式的工作原理。许多机器导出文件都是构建成一组固定的记录类型,这些记录类型会重复出现,每个逻辑项对应一种记录类型——上面的面板导出文件就是这样写入的。 PNL1,一个 PNL2 和 PNL3 对于工作中的每个小组来说,第十个小组的三项记录都与此相关。 _seq = 9分别位于三个不同的表中,因此将面板重新组合起来就是一个普通的连接操作。 源文件 和 _seq.
SELECT a._source_file, a._seq AS panel_no, a.field_1 AS panel_ref, b.field_2 AS width_mm, c.field_3 AS material FROM data_pnl_1 a JOIN data_pnl_2 b ON b._source_file = a._source_file AND b._seq = a._seq JOIN data_pnl_3 c ON c._source_file = a._source_file AND c._seq = a._seq ORDER BY a._source_file, a._seq;
源文件 属于连接部分,因为 _seq 每个文件都会从零开始重新计数。如果没有这个功能,周一导出的第十个面板就会和周二导出的第十个面板合并在一起。
_seq 只计算一个标签,而不是一个组。 它能完美地对齐记录,每个标签在每个组中只出现一次。确实如此。 不 建立一对多关系:在上面的示例文件中有两个 奥德 线和三 ITM 线,所以 ORD._seq 和 ITM._seq 它们含义不同,直接连接起来是错误的。在这种情况下,应该根据文件中已有的引用进行连接——也就是下一节。
将标题与其行项目连接起来
再看一下示例文件,你会发现机器已经帮你解决这个问题了。 ITM 该行重复了来自的订单引用 奥德 它上方一行,位于第一个数据字段中。这是此类格式中的标准做法,因为接收系统需要重新组装文档,这意味着连接操作与您在任何关系数据库中编写的连接操作相同。
SELECT o.field_1 AS order_ref, o.field_2 AS customer, o.field_3 AS due_date, COUNT(*) AS line_count, SUM(i.field_3 * i.field_4) AS order_total FROM data_ord o JOIN data_itm i ON i._source_file = o._source_file AND i.field_1 = o.field_1 GROUP BY o.field_1, o.field_2, o.field_3 ORDER BY order_total DESC;
这个连接器的核心就在于这个查询。一个存放着机器导出文件的文件夹(任何电子表格都无法打开这些文件),现在只需11行普通的SQL语句就能回答关于订单值的问题——而且它一次性回答文件夹中所有文件的问题,而不是逐个文件地回答。
如果你的格式是 不 在儿童记录中重复输入某个键,您仍然可以查看行顺序。 _seq每一行都包含一个 _row_id 由文件名和 物理线路编号 读取该行数据时,先用零填充,以便正确排序。由于行号是实际的行号,因此行标识符和错误行警告指向相同的坐标,并且窗口函数会覆盖该行。 _row_id 可以将每个子记录归属于最近的前一个标题。
字段 3 诚实但不令人印象深刻。只需描述一次标签的含义——“在 数据项“字段 3 是数量,字段 4 是单价”——然后 Nova AI 或您自己的 AI 助手(通过 Query Streams MCP 服务器)将为您生成连接和聚合语句。将其保存为查询,以后就无需再记住字段编号了。
为什么解析发生在 C# 中?
这是唯一一款能够自行解析文件的文件集驱动程序。其他所有驱动程序——CSV、Parquet、Excel、SQLite、JSONL——都会将文件交给 DuckDB 处理,DuckDB 读取文件速度极快,这也是 Parquet 文件夹加载速度极快的原因。而多记录 CSV 驱动程序则特意避免这样做。
原因在于它与其他所有工具一样,都基于同一个假设。DuckDB 的 CSV 读取器基于每个文件一个矩形表构建:每行包含一个列表,每个列表包含一种类型。如果读取的文件包含四种记录类型,那么无论给出怎样的列组合才能使其正确读取,读取器要么报错,要么返回无意义的数据。如果结果错误,速度再快也毫无意义。
因此,代理逐行读取文件,使用与 CSV 连接器相同的带引号的分割器分割每一行,查看标签,将该行与该标签的固定定义进行比对,然后将其路由到正确的表。之后,这些行会在每个文件的单个事务中分批写入本地缓存,这样查询端仍然可以访问真实的数据库。
还有一个附带的好处。因为 DuckDB 永远不会看到这些文件的原始字节,所以避免了一类编码风险。 CSV文件夹连接器 必须防范这种情况,这种情况在这里根本不会发生。字符编码仍然会逐个文件进行检测,并且整个文件夹中的编码必须保持一致。如果文件包含的字节在检测到的编码中无效,则会被拦截而不是解码成乱码。
当线路与引脚不匹配时
标签及其形状确定后,在写入任何内容之前,每个文件的每一行都会与这些标签和形状进行比对。如果三种情况不一致,处理方式相同。
- 一个从未见过的标签——机器开始写入一种在文件夹采样时不存在的记录类型。
- 已知标签的字段数量错误——格式已更改,或者标签列不在连接器被告知要查找的位置。
- 值与其固定类型不符——例如,固定为数字的列中出现了文本,或者日期格式异常。
这些中的任何一个 公园文件:该文件的任何行都不会写入任何表,原因会记录在文件名、行号和标签中。“停车”是文件集的一般行为,详见…… 中心指南您可以通过查询找到已停放的文件 文件事件 用于漂移。
SELECT relative_path, detail, occurred_at FROM files_events WHERE event_type = 'drift' ORDER BY occurred_at DESC;
这份报告有两个与此驱动程序相关的特殊细节,使其格外有用。首先,在插入任何一行数据之前,整个文件都会经过验证,因此已停放的文件确实不会对任何地方产生任何影响——您永远不会看到包含被拒绝的订单项的表头。其次,检查并不会止步于第一个问题:最多会列出二十条违规记录及其行号,然后统计其余违规记录的数量,因此只需检查一遍即可确定是存在单个错误行还是格式错误。
未知标签是最常见的标签,消息会同时列出找到的标签和已知的标签。如果您需要新的记录类型,更改任何连接器选项都会重新采样文件夹并将新标签固定为单独的表。如果您不需要该标签,可以使用文件模式排除包含该标签的文件。
每项多录音设置,以及何时更改
多记录 CSV 卡携带 四种特定格式设置而且大多数文件夹只需要修改其中一个(如果有的话)。卡片上的其他所有内容——根文件夹、递归和最大深度、排除模式、符号链接、文件名解析模式、文件夹标记、扫描间隔、哈希、删除策略、事件保留、扫描限制和四个摄取上限——与其他所有文件夹类型共享,并且只需记录一次。 文件集连接器指南本节仅涵盖标记行文件特有的内容。
注意什么是 不 这里,因为这是普遍的期望。没有 标题 由于这些文件根本没有标题行,因此没有其他选择。 空字符串 或 日期格式 选项,没有 表格布局 别无选择。 表名 字段:多记录 CSV 是一个多表驱动程序,因此表名来自固定清单中的记录标签,而不是来自您键入的任何内容。
记录标签列(编号)
默认值:空白,即第一列。 这是定义格式的设置,值得仔细阅读,因为其中有一个细节:它是一个 从 1 开始的列号不是列名。输入 1, 2, 3 - 绝不 记录类型.
这并非疏忽,而是有意为之。多记录文件没有标题行,因此其列没有名称;给列命名毫无意义,因为文件中没有任何内容与之匹配。因此,连接器在保存时会拒绝非数字名称,而不是猜测您想要的是哪一列。
何时更改: 当标签不是首字段时,请将其留空。对于绝大多数将标签放在首位的格式,请将其设置为 2 或 3 对于那些以其他信息(例如时间戳、批次标识符、站点代码或机器代码)开头,并在其后带有记录类型的导出记录,需要查找编号。要查找编号,请在文本编辑器中打开一个文件,并从左侧开始计数字段,从 1 开始,直到找到包含编号的字段。 HDR, ITM, PNL1 或者任何你喜欢的标签。
2026-08-24T06:11:02,BATCH-7741,HDR,MC-07,v2.1 1 2 3 4 5 ^ 记录标签列 = 3
分隔符
默认值:逗号。 输入字符本身,所以 ; 或 |这一点在这里比在普通的 CSV 文件夹中更为重要,因为使用多记录格式的机器和欧洲出口文件通常以分号分隔——如果您的文件来自板锯、CNC 控制器或欧洲大陆的 ERP 系统, ; 这是首先要尝试的事情。
方言规则与纯 CSV 文件夹遵循的规则相同,包括为什么分隔符是固定的而不是每个文件都重新猜测的原因。这些规则在以下位置有详细说明: 合并多个 CSV 文件到一个表格中 此处不再赘述。
如果做错了,你很快就会知道。 使用逗号分隔符读取分号文件时,每行数据都对应一个字段,也就是一个包含整行数据的“标签”——因此,要么每行数据对应一个表,要么读取失败。这两种情况都不算成功。
引用字符
默认值:双引号。 这是围绕包含分隔符的字段的字符,因此 “史密斯,约翰” 保持为一个字段,而不是两个。仅在特殊导出格式(使用单引号)中需要更改此设置时才需要更改。如果您发现地址或自由文本描述被拆分到多个位置,导致某些行的字段计数与引脚不匹配,则需要检查此设置。
编码
默认值:自动检测这种方法几乎总是正确的。它会检查字节顺序标记,尝试严格的 UTF-8 解码,如果失败则回退到 Windows-1252 启发式解码,然后确定最终结果。可选的编码格式有 UTF-8、Windows-1252 (cp1252)、UTF-16 LE 和 Latin-1。
何时需要覆盖: 当检测失败,因为采样文件不一致,而您知道哪个读数是正确的时,尤其对于这种格式而言。 Windows-1252 是常见的答案 — 较旧的工业控制器和欧洲业务线系统写入 cp1252 时没有字节顺序标记,这正是检测必须推断而不是读取的情况。
需要特别注意的是:cp1252 和 Latin-1 不被视为同一种编码,因为它们在包含智能引号、欧元符号和破折号的字节范围上存在差异。如果选错了编码,欧元符号会被当作控制字符而不是报错,所以请选择导出程序实际写入的编码。
包含模式——将多记录文件与普通 CSV 文件区分开来
包含模式是一个通用设置,但由于此连接器特有的一个陷阱,因此值得在此特别说明。卡片会为模式提供种子。 **/*.csv而且,多记录导出文件几乎总是与普通的 CSV 文件一起保存在同一个文件夹中。 它们不是同一种连接器,绝对不能混用。
缩小范围,使只有标记的文件才在范围内—— **/job_*.csv, exports/machine/**/*.csv无论是什么分隔它们。直接读取包含多条记录的普通 CSV 文件不会报错:它的第一列是实际的数据列,因此其中的每个不同值都会被视为记录标签,最终你会得到每个客户名称对应一个表或每个订单参考号对应一个表。如果无法按模式分隔它们,则该文件夹需要在两个根目录上分别添加两个连接器。
清单覆盖(JSON)——为列指定真实名称的方法
在后面 显示高级选项此设置适用于所有文件夹类型,但在此文件夹类型中尤为重要,原因很简单:因为这些文件没有标题行,所以列名是通用的位置名称。 字段1, 字段2, 字段 3清单覆盖是指在连接器中将它们转换为用户可以读取一次的名称,以便之后每次保存的查询、电子表格刷新和 Nova 查询都能看到合理的列。
{ "重命名": { "数量": "数量" }, "重新类型": { "价格": "DECIMAL(18,4)" }, "排除": [ "内部备注" ] }
- 重命名 ——这里最重要的是:将每个位置列映射到记录类型实际代表的名称:
{ "field_1": "order_ref", "field_2": "description", "field_3": "quantity", "field_4": "unit_price" }你不能重命名为源文件,_row_id或_seq两列不能重命名为同一个名称。 - 重新输入 — 强制指定列的类型。机器导出中常见的情况是,零件或帐户代码完全由数字组成,被固定为数字类型,丢失了前导零;将其设置为
VARCHAR它以文本形式返回。您在此处设置的类型是明确的指令,因此无需进行通常会将文件搁置的严格检查即可应用。 - 排除 — 完全从表格中移除列。这对于填充格式中大量的填充字段和保留字段非常有用。
当形状被固定时,覆盖设置会被应用,因此它们会成为表定义的一部分,而不是在查询时重新应用的内容。 清空盒子会清除你的所有设置。 并将表格恢复为采样时的形状。仅接受带有可选精度的普通类型名称。 DECIMAL(18,2), VARCHAR, 大情报, 日期 — 任何异常情况都会在保存时而不是同步时被拒绝。
重命名 这区分了只有你能查询的连接器和整个团队都能查询的连接器。连接器无法识别的设置会被直接拒绝,而不是被忽略,因为一个默默无闻、什么也不做的选项看起来和正在生效的选项完全一样。
设置
您需要一个 Query Streams 帐户,并在能够访问该文件夹的计算机上安装网络代理——通常是接收导出文件的计算机,或者挂载了共享文件夹的服务器。多记录 CSV 需要 网络代理 2.6 或更高版本.
- 从此处安装代理。 下载页面 如果它还没有运行的话。
- 先用文本编辑器打开一个文件,确认两件事:标签在哪一列,以及实际显示了哪些标签。花两分钟确认一下,可以避免之后困惑地拒绝。
- 在门户中,添加数据连接器并选择 多记录 CSV.
- 输入代理计算机上显示的文件夹路径,如果文件夹包含多种类型的导出文件,则还需要输入文件模式。
- 放 记录标签列 仅当标签不是第一个字段时,并且 分隔符 仅当文件不是以逗号分隔时才有效。
- 保存。代理程序会对文件夹进行抽样,并报告找到的标签,每个标签对应一个表格,表格中包含每个标签的列和类型。
- 打开查询构建器并编写您的第一个连接语句——或者向 Nova AI 描述标签,让它为您编写连接语句。
由于采样文件必须在每个标签的形状上保持一致,因此该连接器会在您首次运行时告知您一些关于数据的信息。如果拒绝识别两个文件中字段数量不同的标签,通常意味着机器固件或导出模板已更改,您现在可以查找更改日期。
之后,它的行为就和其他数据源一样了。数据表可以通过插件出现在 Microsoft Excel 和 Google Sheets 中,通过定时同步出现在 Airtable、Smartsheet、Baserow 和 SeaTable 中,出现在 Nova AI 中,并通过 Query Streams MCP 服务器出现在 Claude、Cursor、ChatGPT 或 Grok 中。它们还可以连接到您的数据库,因此只需一条只读语句,即可将机器导出的数据与 PostgreSQL 中的订单表进行核对。
常见问题
什么是多记录 CSV 文件? +
为什么微软Excel和其他CSV工具无法打开这些文件? +
我可以坐哪些桌子? +
数据_ 加上标签—— 数据头, 数据顺序, 数据项 以此类推。文件夹中的每个文件都会影响所有这些表,因此这些表覆盖整个文件夹,而不是单个文件。此外,您还可以获得文中描述的四个标准文件集管理表。 中心指南.
究竟什么是 _seq 柱子?
+
_seq 是 该标签在该文件中的从零开始的出现索引每个标签独立计数。第一个 PNL1 文件中的一行是 _seq = 0第二个是 _seq = 1如果一种格式对每个逻辑项重复使用一组固定的记录类型,则同一逻辑项的所有记录共享相同的记录类型。 _seq所以加入 源文件 加 _seq 重新组装该项目。它统计的是单个标签,而不是标签组,因此它不是一对多关系的正确键。
如何将订单表头与其订单项关联起来? +
源文件 再加上文件中已在子记录中重复出现的引用——几乎所有这些格式都会在每一行包含文档键,正是出于这个原因。如果你的文件没有,请使用 _row_id,它对物理行号进行编码,并使用窗口函数将每个子行归类到最近的前一个行头。 _seq 仅当两个标签在每个组中确实各出现一次时才有效。
如果文件包含 Query Streams 尚未见过的记录标签会发生什么情况? +
文件事件 指定文件名、行号、无法识别的标签以及连接器已知的标签。如果需要使用新标签,更改任何连接器选项都会重新采样文件夹并将其固定为一个单独的表;否则,使用特定模式排除该文件。
记录标签可以放在第一列以外的位置吗? +
为什么这些列被称为 字段1 和 字段2 而不是真实姓名?
+
字段1 这是标签之后的第一个数据字段。随意命名意味着只能猜测。只需在已保存的查询或向 Nova AI 发出的提示中为编号字段赋予含义,下游所有用户就能读取到合理的列名。
这是一个 EDI 解析器吗? +
我的文件是已上传还是已修改?我需要哪个版本的代理? +
选择, 和, 实践, 描述 或 解释多记录 CSV 需求 网络代理 2.6 或更高版本可从以下渠道获取 下载页面.
开始
查询导出内容,不会打开其他任何内容。
将代理指向您已标记的机器导出文件文件夹,即可为每种记录类型生成一个干净的 SQL 表,并使用普通 SQL 语句将它们连接起来——可在 Microsoft Excel、Google Sheets、Airtable 或您的 AI 助手中使用。您的文件永远不会离开您的网络。
相关指南: 如何使用 SQL 查询文件夹中的文件 | 合并多个 CSV 文件到一个表格中 | 下载查询流代理 | 所有文件集连接器指南
类别:文件集连接器
标签:多记录 CSV、记录类型 CSV、混合记录 CSV、EDI 样式 CSV、机器导出文件、文件集连接器、文件 SQL
元描述:查询每行形状不同的 CSV 文件。每个记录标签对应一个 SQL 表,并通过 SQL 进行重新连接。

