csvkit csvclean 完全指南:CSV 数据质量检查与自动修复实战 数据分析开发工具【免费下载链接】csvkitA suite of utilities for converting to and working with CSV, the king of tabular file formats.项目地址https://gitcode.com/gh_mirrors/cs/csvkit点击查看免费下载导读csvclean是 csvkit 命令行工具套件csvkit/utilities/csvclean.py中专门用于报告并修复 CSV 常见错误的实用工具。它能够检测数据行与表头列数不一致空列等典型数据质量问题也能自动修复未加引号的单元格内含换行缺失分隔符多余空列等脏数据场景是清洗批量导入前数据的可靠第一道防线。读完本文你将掌握csvclean的全部检查项、修复项、输出行为与退出码约定并能在管道pipe与自动化脚本中正确组合使用它。一、csvclean 能做什么检查项与修复项总览csvclean的核心职责由两个层面构成Checks检查/报告错误与Fixes修复二者在命令行参数上严格区分。检查项Checks--length-mismatch报告数据行与表头行列数不一致的行既包括更短的行也包括更长的行。--empty-columns报告全列为空的列即该列在所有数据行中都没有非空值。提示使用-a/--enable-all-checks可以一次性启用全部检查项。从 csvkit/utilities/csvclean.py 的源码可以看到enable_all_checks会作为length_mismatch与empty_columns的默认值default self.args.enable_all_checks传入RowChecker即启用-a等价于同时打开这两个检查。修复项Fixes修复项按场景分为四类下文逐一给出问题输入 → 命令 → 修复输出的完整演示。二、修复一未加引号的单元格内含换行 ——--join-short-rows问题场景某些导出工具会把多行地址写成未加引号的裸换行导致一个逻辑记录被错误拆成多行。例如id,address,country 1,1 Main St Springfield,US 2,123 Acadia Avenue London,GB修复命令csvclean --join-short-rows input.csv输出id,address,country 1,1 Main St Springfield,US 2,123 Acadia Avenue London,GB--join-short-rows会把连续出现的短行合并进前一个短行的最后一个单元格从而恢复完整记录。自定义连接字符串--separator默认合并时使用换行符作为连接串源码中default\n见 csvkit/utilities/csvclean.py。通过--separator可以自定义csvclean --join-short-rows --separator , input.csv输出id,address,country 1,1 Main St, Springfield,US 2,123 Acadia Avenue, London,GB源码级原理合并逻辑实现在 csvkit/cleanup.py 的join_rows函数它取第一行作为基准然后逐行将后续行的首单元格拼接到上一行末尾单元格其余单元格依次追加直到行宽与表头一致。在RowChecker.checked_rows()中csvkit/cleanup.py短行会先被缓存进joinable_row_errors且只有当连续的短行合并后恰好等于表头列数时才算修复成功合并后仍然过短或过长时算法会继续尝试丢弃最早的一行再合并而不会跨过合法行或长行强行拼接。对应的测试用例见 tests/test_utilities/test_csvclean.py其中test_join_short_rows与test_join_short_rows_separator使用XYZ作为分隔符验证了examples/test_join_short_rows.csv的修复行为。三、修复二缺失分隔符 ——--fill-short-rows问题场景数据行末尾缺少必要的逗号分隔符例如id,name,country 1,Alice 2,Bob,CA第 1 行只有 2 个单元格而表头有 3 列。修复命令csvclean --fill-short-rows input.csv输出id,name,country 1,Alice, 2,Bob,CA--fill-short-rows会在短行末尾补上缺失的空单元格。源码实现在 csvkit/cleanup.pyrow [self.fillvalue] * (len_column_names - len(row))。小技巧不带任何选项的csvcut也会自动补全缺失的分隔符见 docs/scripts/csvcut.rst可作为这条修复路线的替代方案。自定义填充值--fillvalue默认填充值为空fillvalueNone也可以用--fillvalue指定具体的补全内容csvclean --fill-short-rows --fillvalue US input.csv输出id,name,country 1,Alice,US 2,Bob,CA测试用例见 tests/test_utilities/test_csvclean.py分别验证了默认空值填充与--fillvalue XYZ的自定义填充结果。四、修复三删除空列 ——--remove-empty-columns问题场景数据中存在整列为空的列例如结构变化遗留的占位列id,name,extra 1,Alice, 2,Bob,修复命令csvclean --remove-empty-columns input.csv输出id,name 1,Alice 2,Bob源码级原理与边界行为空列检测是文件级file-level检查必须读完全部数据行后才能判定某列是否在所有行中均为空。因此源码在 csvkit/cleanup.py 中会将数据行缓冲到output_rows列表读完后再根据empty_counts统计结果决定保留哪些列csvkit/cleanup.py。同时注意空列的判定基于全部输入行而非输出行。测试test_remove_empty_columns_counts_omitted_rowstests/test_utilities/test_csvclean.py表明若某列只在被省略的长行里有值则该列仍会被保留。短行在移除空列后不会被自动补齐test_remove_empty_columns_short_row见 tests/test_utilities/test_csvclean.py。五、附带修复--header-normalize-space该选项用于规整表头去除表头单元格首尾的空白并将连续的空白字符序列压缩为单个空格。它位于csvclean的修复项列表中源码实现为csvkit/cleanup.pyself.column_names [ .join(column_name.split()) for column_name in self.column_names]对应的测试用例test_header_normalize_spacetests/test_utilities/test_csvclean.py使用 examples/test_header_newline.csv 验证了带换行与空白的表头 start\n\n end 被归一化为start end。六、输出行为与退出码约定csvclean先尝试执行所选修复然后遵循以下输出规则标准输出stdout若设置了--omit-error-rows只输出通过所选检查的行否则输出全部行包括报错行。标准错误stderr只要启用了任一检查就会把**错误行连同行号line_number与描述msg**写入标准错误一旦存在错误行进程退出码为 1。sys.exit(1)的实现在 csvkit/utilities/csvclean.py。错误报告的 CSV 表头固定为line_number,msg,各列名...若设置了--label会在最前面插入label列见 csvkit/utilities/csvclean.py。注意如果任何检查或修复项都没有启用csvclean会直接报错退出No checks or fixes were enabled...见 csvkit/utilities/csvclean.py同时--join-short-rows与--fill-short-rows是互斥选项不可同时使用。这两条规则都有对应的测试用例test_optionstests/test_utilities/test_csvclean.py。每个 csvkit 工具都会做的默认格式化文档明确约定所有 csvkit 工具在输出前都会统一执行以下转换移除可选引号字符除非用--quoting-u改变该行为将字段分隔符改为逗号若通过--delimiter-d或--tabs-t指定了输入分隔符将记录分隔符改为换行符LF\n将引号字符改为双引号若通过--quotechar-q指定将字符编码转为 UTF-8若通过--encoding-e指定。因此当多个 csvkit 命令通过管道串联时这些参数只需在第一个命令中指定一次详见 docs/common_arguments.rst。测试用例tests/test_utilities/test_csvclean.py验证了csvclean确实会移除可选引号、统一换行符、转换编码并剥离 UTF-8 BOM。七、命令行用法全解usage: csvclean [-h] [-d DELIMITER] [-t] [-q QUOTECHAR] [-u {0,1,2,3}] [-b] [-p ESCAPECHAR] [-z FIELD_SIZE_LIMIT] [-e ENCODING] [-S] [-H] [-K SKIP_LINES] [-v] [-l] [--zero] [-V] [FILE]位置参数FILE要处理的 CSV 文件。省略时从标准输入STDIN读取管道数据。csvclean 专属可选参数参数说明--length-mismatch报告比表头短或长的数据行--empty-columns将空列报告为错误-a,--enable-all-checks启用全部错误报告--omit-error-rows从标准输出中省略包含错误的数据行--label LABEL向标准错误添加label列便于自动化工作流用-则默认取输入文件名--header-normalize-space去除表头首尾空白并将连续空白压缩为单个空格--join-short-rows将短行合并为单行--separator SEPARATOR合并短行时使用的连接字符串默认换行--fill-short-rows用缺失的单元格填充短行--fillvalue FILLVALUE填充短行时使用的值默认为空--remove-empty-columns从标准输出中移除空列--label的取值细节值得注意传-时若输入来自 stdin 则标签为stdin否则取输入文件名测试用例见 tests/test_utilities/test_csvclean.py。通用参数所有 csvkit 工具共享-h/--help、-d/--delimiter、-t/--tabs、-q/--quotechar、-u/--quoting0 最小引用、1 全引用、2 非数字引用、3 不引用、-b/--no-doublequote、-p/--escapechar、-z/--maxfieldsize、-e/--encoding、-S/--skipinitialspace、-H/--no-header-row生成a,b,c,...默认表头、-K/--skip-lines跳过表头前的注释/空行等、-v/--verbose、-l/--linenumbers、--zero列号从 0 起算、-V/--version等完整清单见 docs/common_arguments.rst。八、实战示例从检测到修复的完整工作流示例 1处理行列数不一致的文件并剔除错误行使用仓库自带的坏样例 examples/bad.csv内含 1 行长行、1 行短行$ csvclean --length-mismatch --omit-error-rows examples/bad.csv 2 errors.csv column_a,column_b,column_c 0,mixed types.... uh oh,17错误明细被重定向到errors.csv$ cat errors.csv line_number,msg,column_a,column_b,column_c 1,Expected 3 columns, found 4 columns,1,27,,Im too long! 2,Expected 3 columns, found 2 columns,,Im too short!重要限制如果数据行比表头更长必须手动补全表头例如在表头末尾追加一个或多个逗号。csvclean之所以不自动做这件事是因为它面向标准输入流式处理若要在文件开头就依据文件末尾的观察结果来修正错误就必须把整个 CSV 缓存在内存中这对大文件不可行。长行问题的处理思路可参见 docs/scripts/csvcut.rst。示例 2检测并剔除空列$ csvclean --empty-columns examples/test_empty_columns.csv 2 errors.csv a,b,c,, a,,,, ,,c,, ,,,,$ cat errors.csv line_number,msg,a,b,c,, 1,Empty columns named b, , ! Try: csvcut -C 2,4,5,,,,,错误信息会直接给出建议的csvcut命令。按提示用csvcut排除空列examples/test_empty_columns.csv$ csvcut -C 2,4,5 examples/test_empty_columns.csv a,c a, ,c ,示例 3在脚本中根据退出码判断是否有错误$ if [ csvclean -a examples/bad.csv ]; then echo my message; fi my message或等价写法$ [ csvclean -a examples/bad.csv ] echo my message my message更标准的做法是显式检查退出码$ csvclean -a examples/bad.csv /dev/null 21 $ echo $? 1示例 4统计错误数量将csvclean的错误输出通过管道交给csvstat --count统计行数$ csvclean -a examples/bad.csv 21 /dev/null | csvstat --count 2示例 5只查看错误明细$ csvclean -a examples/bad.csv 21 /dev/null line_number,msg,column_a,column_b,column_c 1,Expected 3 columns, found 4 columns,1,27,,Im too long! 2,Expected 3 columns, found 2 columns,,Im too short!示例 6配合--skip-lines处理带前置说明行的文件仓库样例 examples/bad_skip_lines.csv 在表头前有 3 行空行/说明行可用-K 3跳过测试见 tests/test_utilities/test_csvclean.pycsvclean --length-mismatch --omit-error-rows --skip-lines 3 examples/bad_skip_lines.csv 2 errors.csv示例 7统一换行符为 CRLFcsvclean默认输出 LF\n换行如需改为 CRLF\r\n可借助csvformat的-M选项csvkit/utilities/csvformat.pycsvformat -M $\r\n examples/dummy.csv九、自动化工作流中的最佳实践用--label追踪错误来源在批量清洗多个文件时--label能让错误报告自带来源标记避免多个文件错误混淆。--label -会自动使用输入文件名stdin 时为stdin。用退出码驱动流水线csvclean在存在错误行时退出码为 1可用/||或$?在脚本中决定是否中断处理或发送告警。先-a全面体检再针对性修复先用-a摸清数据里有哪些问题再根据错误报告选择--join-short-rows、--fill-short-rows、--remove-empty-columns等修复项组合。记住流式处理约束csvclean按行流式处理无法在读取过程中回头修改表头涉及依据整文件判定的空列检测则会缓冲数据行源码见 csvkit/cleanup.py对大文件应结合--omit-error-rows权衡内存开销。与其他 csvkit 工具串联csvclean的输出保持 CSV 标准格式逗号分隔、双引号引用、LF 换行、UTF-8可直接管道给csvcut、csvstat、csvlook、csvjson等工具继续加工。十、相关资源本命令的完整源码csvkit/utilities/csvclean.py底层清洗引擎RowChecker与join_rowscsvkit/cleanup.py自动化测试套件tests/test_utilities/test_csvclean.py所有 csvkit 工具的通用参数说明docs/common_arguments.rst配套工具csvcut文档docs/scripts/csvcut.rst可直接用于练习的样例数据examples/bad.csv、examples/test_empty_columns.csv、examples/test_join_short_rows.csv、examples/bad_skip_lines.csv赞分享数据分析开发工具【免费下载链接】csvkitA suite of utilities for converting to and working with CSV, the king of tabular file formats.项目地址https://gitcode.com/gh_mirrors/cs/csvkit点击查看免费下载相关推荐csvkit csvsql 实战指南CSV 建表、批量入库与即席 SQL 查询csvkit csvsql 实战指南CSV 建表、批量入库与即席 SQL 查询 csvsql 是 csvkit 工具套件中最具“双向能力”的一员它既能把一个数据分析开发工具MinIO数据修复自动检测与恢复全指南MinIO数据修复自动检测与恢复全指南 引言分布式存储的隐形痛点 你是否曾遭遇过分布式存储集群中数据损坏却毫无察觉的情况在企业级存储场景中硬件故障、网络后端存储对象存储分布式存储云原生如何用Great Expectations实现数据质量自动化检查完整指南如何用Great Expectations实现数据质量自动化检查完整指南 在数据驱动决策的时代数据质量问题可能导致严重后果。 Great Expectati数据质检数据工程上一篇如何用timeline-vuejs实现信息可视化揭秘7个创意应用场景下一篇DaVinci大数据可视化平台AI智能分析与未来功能深度展望创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考