跳转到内容
原创教程官方文档整理

DuckDB CSV 坏行定位:导入前把错误原文单独导出

可用 CSV、错误原文清单与扫描配置,能解释排除数据。

适用场景固定 CSV 列类型,用 store_rejects 保存坏行位置与原因,分别导出可用数据和错误清单,再做数量核对;附故意损坏的样例。

来源 · JevLog 编辑部Intermediate15 分钟

固定 CSV 列类型,用 store_rejects 保存坏行位置与原因,分别导出可用数据和错误清单,再做数量核对;附故意损坏的样例。

来源 · JevLog 编辑部 · 本站原创

原文封面 · DuckDB

原文封面 · DuckDB

2026-10-02 新增:依据当前官方文档整理,附本站编写练习。未做真实服务调用;来源首次发布日期未确认。

忽略坏行会让导入成功掩盖丢失数据。先确定哪些记录未进入后续分类、原因是什么、怎样回原文件。这由确定性解析完成,不让 AI 猜数量或格式。

  • 安装 DuckDB CLI,下载 faulty-intake.csv;保持原件,输出用新文件名。

  • 列类型固定为 id VARCHAR、count INTEGER、channel VARCHAR。

  • 官方文档

  • 官方文档

JevLog 原创流程图,非产品截图或实测结果。

JevLog 原创流程图,非产品截图或实测结果。

不要凭第一行推断。count 必须是整数,ID 按文本保留前导零;many、缺列和多列都应进入错误清单。先记导入文件版本与预计记录数。

同一个 DuckDB 会话执行下面 SQL。SELECT * 让全部列参与解析;只选 id 可能因投影优化没有检查 count。store_rejects 跳过并记错误,不能据此说数据已经修复。

CREATE TABLE accepted AS
SELECT * FROM read_csv('faulty-intake.csv',
header = true,
columns = {'id': 'VARCHAR', 'count': 'INTEGER', 'channel': 'VARCHAR'},
store_rejects = true, rejects_limit = 0);
SELECT * FROM reject_errors;
SELECT * FROM reject_scans;
SELECT count(*) AS accepted_rows FROM accepted;
COPY accepted TO 'accepted-intake.csv' (HEADER, DELIMITER ',');
COPY reject_errors TO 'intake-errors.csv' (HEADER, DELIMITER ',');
COPY reject_scans TO 'intake-scans.csv' (HEADER, DELIMITER ',');

3. 原文、位置、解析配置一起留

Section titled “3. 原文、位置、解析配置一起留”

reject_errors 留行位置、列和原因,reject_scans 留文件与读取配置。一个坏行可能产生多个错误记录,不能把错误表行数当成丢失记录数。两张临时表退出会话前一起导出。

样例有六条数据记录,设计上三条可接受、三条类型或结构问题。实际不同就先查版本、换行和参数。many 的具体值由人回原来源补,不让模型随手生成整数。

只把 accepted-intake.csv 给后续分类,拒绝清单另交数据修正。修后新存版本,再全量解析;记录文件哈希、修正人和导入时间,不覆盖原件。

练习样例:下载 faulty-intake.csv,可在本地练习;非本站实测结果。

可用 CSV、错误原文清单与扫描配置,能解释排除数据。

  • 带引号的跨行值会让物理行数不同于记录数,按记录核对。
  • 接受与拒绝数量能解释,错误原文能定位。
  • 修正有版本,不伪造缺失值。

来源边界:依据所列公开来源整理;本站未复现演示。分类结果需人工复核,不会自动执行。

跳过不能解释数据去了哪里;store_rejects 保留原文、位置和原因,便于修正。