关于 large-scale-text-editing
这项技能介绍如何规划并验证超大型文本文件的转换,适用于分隔数据和重复编辑任务,涵盖抽样、工具选择、渐进测试及结果核查。
主要功能
- 01抽样检查文件而不完整读取
- 02选择 Vim、sed、awk、Perl 或 Python
- 03将转换拆分为可测试步骤
- 04原地修改前备份文件
- 05用行数、差异和抽样核验结果
适用场景
- 01重排或删除大型分隔文件的列
- 02批量应用重复的模式编辑
- 03满足击键数或操作次数限制
- 04抽查文件不同位置的转换结果
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ letta-ai/ skills --skill large-scale-text-editing安装后在 Claude Code 中输入/large-scale-text-editing确认已加载。
详细介绍
大规模文本编辑
概述
本技能介绍如何高效转换包含数千至数百万行的大型文本文件。内容涵盖理解转换要求、设计高效方案(尤其是使用 Vim 宏)、测试方法和验证技巧。
何时使用此技能
- 大规模转换 CSV、TSV 或其他分隔符文件
- 对包含数百万行的文件重复执行编辑
- 需要遵守击键次数或操作次数限制
- 使用 Vim 宏、sed、awk 或类似的批处理工具
- 使用正则表达式进行基于模式的文本转换
方法策略
阶段 1:理解转换要求
编写任何转换逻辑之前:
-
先评估文件大小 - 尝试读取文件前,使用
ls -lh或wc -l检查文件大小。避免直接读取数百万行的文件。 -
有针对性地抽取样本 - 从多个位置提取样本:
- 开头:
head -n 100 input.csv > sample_head.csv - 中间:
sed -n '500000,500100p' input.csv > sample_middle.csv - 结尾:
tail -n 100 input.csv > sample_tail.csv
- 开头:
-
比较输入与预期输出 - 确定所有需要执行的转换:
- 调整列顺序或删除列
- 更改分隔符
- 大小写转换
- 处理空白字符
- 在值前后追加内容
- 格式转换
-
验证结构假设:
- 所有行的列数是否一致
- 是否存在表头行
- 是否存在空行或格式错误的行
- 是否存在可能导致正则表达式模式失效的特殊字符
阶段 2:设计解决方案
设计转换方案时:
-
将复杂转换拆分为独立步骤 - 每一步只处理一种逻辑转换。这样更便于调试,也可以单独测试各步骤。
-
根据规模选择合适的工具:
- Vim 宏:非常适合复杂的多步骤转换,也便于统计击键次数
- sed:适用于对大型文件进行简单替换,速度快
- awk:擅长列操作和条件逻辑
- Perl/Python:适用于超出正则表达式能力范围的复杂逻辑
-
注重效率:
- 尽量减少遍历文件的次数
- 使用基于行的操作(Vim 中的
:%normal!),而非使用显式循环逐行处理 - 优先使用内置命令(例如 Vim 中用于转为大写的
gU),而不是手动逐字符操作
-
记录设计决策 - 说明选择特定方案的原因,尤其是在存在多种可行方案时。
阶段 3:逐步测试
-
创建测试样本 - 使用较小的子集(100-1000 行)进行初步测试:
head -n 100 input.csv > test_input.csv head -n 100 expected.csv > test_expected.csv -
单独测试每项转换 - 将各个宏或命令组合前,先确认其输出正确。
-
使用 diff 验证 - 逐字节比较:
diff test_output.csv test_expected.csv -
检查测试输出中的边缘情况:
- 第一行和最后一行是否正确转换
- 是否能处理内容长度不同的行
- 特殊字符是否按预期保留或转换
阶段 4:执行并采取防护措施
-
原地修改前创建备份:
cp input.csv input.csv.backup -
设置合适的超时时间 - 对于百万行文件,应预留足够的处理时间(例如,根据复杂程度预留 2-5 分钟)。
-
尽可能监控进度 - 使用可显示进度的工具,或检查中间输出。
-
验证最终输出:
- 确认行数相符:
wc -l output.csv - 与预期输出进行 diff 比较
- 抽查文件不同位置的样本
- 确认行数相符:
Vim 专用指南
宏设计原则
- 寄存器分配:为不同的转换阶段使用不同的寄存器(a、b、c)
- 击键效率:优先使用内置命令,而非逐字符操作
- 正则表达式模式:使用非贪婪模式和明确的分隔符,避免匹配范围过大
适用于大文件的 Vim 常见模式
| 任务 | 方法 |
|---|---|
| 对所有行应用宏 | :%normal! @a |
| 转换为大写 | 使用 gU 动作或在替换命令中使用 \U |
| 操作列 | 使用捕获组 \(\) 和反向引用 \1、\2 |
| 替换分隔符 | :s/old_delim/new_delim/g |
| 移除空白字符 | :s/\s\+//g |
Vim 脚本中的转义
使用 setreg() 定义宏时:
- 转义反斜杠:用
\\表示字面反斜杠 - 使用
\r表示回车符 - 特殊字符可能需要双重转义
验证清单
确认任务完成前:
- 输出文件存在且非空
- 行数与预期一致
- 与预期输出进行逐字节比较后通过(如果有预期输出)
- 抽查文件开头、中间和结尾的样本
- 满足所有约束(击键次数限制、命令限制等)
- 工具以成功代码退出(退出代码为 0)
常见问题
| 问题 | 预防措施 |
|---|---|
| 直接读取大文件 | 始终先检查文件大小;使用 head/tail/sed 抽样 |
| 原地编辑前未备份 | 修改前创建备份副本 |
| 只在前几行测试 | 从文件的多个位置抽样 |
| 假定结构均匀一致 | 使用不同位置的样本验证结构 |
| 正则表达式匹配过度 | 使用明确的分隔符和非贪婪量词 |
| 超时时间不足 | 根据文件大小计算预期处理时间 |
| 未验证退出代码 | 操作后检查工具退出状态 |
效率注意事项
当击键次数或操作次数很重要时:
- 准确计数 - 理解特定上下文中“击键”的定义(转义序列、特殊按键)
- 合并操作 - 一条正则替换命令可能替代多个简单操作
- 使用内置命令 - 原生命令通常比手动实现更高效
- 减少冗余 - 避免重复读取文件或重复转换
评论
支持 Markdown