DuckDB CSV 坏行定位:导入前把错误原文单独导出
可用 CSV、错误原文清单与扫描配置,能解释排除数据。
适用场景固定 CSV 列类型,用 store_rejects 保存坏行位置与原因,分别导出可用数据和错误清单,再做数量核对;附故意损坏的样例。
固定 CSV 列类型,用 store_rejects 保存坏行位置与原因,分别导出可用数据和错误清单,再做数量核对;附故意损坏的样例。
来源 · JevLog 编辑部 · 本站原创

原文封面 · DuckDB
2026-10-02 新增:依据当前官方文档整理,附本站编写练习。未做真实服务调用;来源首次发布日期未确认。
背景 / 问题
Section titled “背景 / 问题”忽略坏行会让导入成功掩盖丢失数据。先确定哪些记录未进入后续分类、原因是什么、怎样回原文件。这由确定性解析完成,不让 AI 猜数量或格式。
-
安装 DuckDB CLI,下载 faulty-intake.csv;保持原件,输出用新文件名。
-
列类型固定为 id VARCHAR、count INTEGER、channel VARCHAR。
JevLog 原创流程图,非产品截图或实测结果。
1. 固定列定义
Section titled “1. 固定列定义”不要凭第一行推断。count 必须是整数,ID 按文本保留前导零;many、缺列和多列都应进入错误清单。先记导入文件版本与预计记录数。
2. 全列物化并收集错误
Section titled “2. 全列物化并收集错误”同一个 DuckDB 会话执行下面 SQL。SELECT * 让全部列参与解析;只选 id 可能因投影优化没有检查 count。store_rejects 跳过并记错误,不能据此说数据已经修复。
CREATE TABLE accepted ASSELECT * 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 留文件与读取配置。一个坏行可能产生多个错误记录,不能把错误表行数当成丢失记录数。两张临时表退出会话前一起导出。
4. 核对数量再修正
Section titled “4. 核对数量再修正”样例有六条数据记录,设计上三条可接受、三条类型或结构问题。实际不同就先查版本、换行和参数。many 的具体值由人回原来源补,不让模型随手生成整数。
5. 交接可用数据与拒绝待办
Section titled “5. 交接可用数据与拒绝待办”只把 accepted-intake.csv 给后续分类,拒绝清单另交数据修正。修后新存版本,再全量解析;记录文件哈希、修正人和导入时间,不覆盖原件。
练习样例:下载 faulty-intake.csv,可在本地练习;非本站实测结果。
可用 CSV、错误原文清单与扫描配置,能解释排除数据。
- 带引号的跨行值会让物理行数不同于记录数,按记录核对。
- 接受与拒绝数量能解释,错误原文能定位。
- 修正有版本,不伪造缺失值。
来源边界:依据所列公开来源整理;本站未复现演示。分类结果需人工复核,不会自动执行。
ignore_errors 就够了吗?
Section titled “ignore_errors 就够了吗?”跳过不能解释数据去了哪里;store_rejects 保留原文、位置和原因,便于修正。