怎么用脚本转换分隔符文本

wen 实用脚本 1

怎么用脚本转换分隔符文本(CSV/TSV/自定义分隔符全攻略)

目录导读

  1. 什么是分隔符文本 – 初识CSV、TSV与自定义分隔符
  2. 为什么需要脚本转换分隔符 – 跨系统数据兼容、清洗与迁移
  3. 脚本转换的三种主流方案
    • Bash(Linux/macOS)
    • Python(跨平台灵活方案)
    • PowerShell(Windows原生)
  4. 实战案例:从逗号分隔到制表符分隔
  5. 常见问答(FAQ)
  6. 脚本转换中的坑与避坑指南
  7. 总结与效率提升建议

什么是分隔符文本

分隔符文本,指用特定字符(如逗号、制表符、竖线、分号)将数据字段隔开的纯文本文件,最常见的是:

怎么用脚本转换分隔符文本

  • CSV(逗号分隔值):使用逗号
  • TSV(制表符分隔值):使用制表符 \t
  • PSV(管道符分隔值):使用竖线

实际工作中,不同系统会输出不同格式:Excel 默认用逗号,某些数据库导出用制表符,而老旧系统可能用分号。“怎么用脚本转换分隔符文本”就成了数据工程师的必修课。


为什么需要脚本转换分隔符

  • 跨系统兼容:A 系统输出 CSV,B 系统只认 TSV。
  • 数据清洗:原本用逗号,但字段内含逗号导致错列,需改为更安全的制表符。
  • 批量处理:手动打开几百个文件转换?脚本一行搞定。
  • 自动化流水线:在 ETL 流程中,脚本转换是常见环节。

脚本转换的三种主流方案

1 Bash 方案(Linux/macOS)

适用于类 Unix 环境,轻量无需安装额外工具。

# 将 CSV 转为 TSV(用 sed 将逗号替换为制表符)
sed 's/,/\t/g' input.csv > output.tsv
# 更严谨的版本:考虑引号内逗号(需用 csvkit 或 awk 处理)
# 安装 csvkit 后:
csvformat -D $'\t' input.csv > output.tsv

注意事项:简单 sed 会误替换引号内的逗号,导致数据错乱,建议用 csvkitawk 处理复杂场景。

2 Python 方案(跨平台通用)

Python 拥有最灵活的标准库 csv,且内置处理引号内逗号、换行符的逻辑。

#!/usr/bin/env python3
import csv
import sys
# 用法: python csv_to_tsv.py input.csv output.tsv
input_file = sys.argv[1]
output_file = sys.argv[2]
with open(input_file, 'r', newline='', encoding='utf-8') as inf:
    reader = csv.reader(inf)
    with open(output_file, 'w', newline='', encoding='utf-8') as outf:
        writer = csv.writer(outf, delimiter='\t')
        for row in reader:
            writer.writerow(row)
print("转换完成!")

优势:自动处理引号、换行、编码,适用于任意分隔符(csv.reader 支持自定义 delimiter)。

3 PowerShell 方案(Windows 原生)

# Import-Csv 自动解析 CSV,Export-Csv 指定分隔符
$data = Import-Csv "input.csv"
$data | Export-Csv "output.tsv" -Delimiter "`t" -NoTypeInformation

注意:PowerShell 的 Import-Csv 默认使用逗号,-Delimiter 参数可改为分号或制表符。


实战案例:从逗号分隔到制表符分隔

场景:你有一个老旧的 employees.csv,字段含逗号(如地址:"北京市,朝阳区"),直接替换会损坏数据。

正确脚本(Python 版)

import csv
import sys
def convert_delimiter(input_path, output_path, input_delim=',', output_delim='\t'):
    with open(input_path, 'r', newline='', encoding='utf-8') as inf:
        reader = csv.reader(inf, delimiter=input_delim)
        with open(output_path, 'w', newline='', encoding='utf-8') as outf:
            writer = csv.writer(outf, delimiter=output_delim)
            for row in reader:
                writer.writerow(row)
if __name__ == "__main__":
    # 用法:python convert.py in.csv out.tsv
    convert_delimiter(sys.argv[1], sys.argv[2])

验证结果

  • 原 CSV 行:1001,张三,"北京市,朝阳区",技术部
  • 转换后 TSV 行:1001\t张三\t北京市,朝阳区\t技术部 (引号被保留或移除取决于 Python 版本,但字段正确)

常见问答(FAQ)

Q1:脚本转换会破坏数据编码吗?

:会,建议在脚本中明确定义编码(如 utf-8gbk),若不指定,Windows 默认可能用 gbk,Linux 用 utf-8,导致乱码,Python 脚本中加上 encoding='utf-8-sig' 可以兼容 BOM。

Q2:分隔符出现在字段内部怎么办?

:这是最易踩的坑,Python 的 csv.reader 默认处理引号包裹的字段,可放心使用,而 sed 's/,/\t/g' 会误替换。复杂数据一定用 Python 或 csvkit

Q3:可以批量转换目录下所有 CSV 吗?

:可以,Bash 中 for f in *.csv; do ... done;Python 中 os.listdir + glob

Q4:转换后字段顺序变了或乱序了,怎么办?

:除非你操作了字典(csv.DictReader),否则 csv.reader 按行顺序读取,不会改变列顺序,若出现乱序,通常是因为源文件本身包含 BOM 或换行符异常。


脚本转换中的坑与避坑指南

常见问题 解决方法
逗号在引号内被替换 使用 Python csv.reader,不用文本替换
文件编码混乱(中文乱码) 统一用 utf-8-sig 读取,指定输出编码
空行或换行符被吞 open(newline='') 参数防止 Python 自动转义
Windows 换行符 \r\n 与 Unix 不兼容 newline='' 控制,或 dos2unix 预处理
超大文件(GB 级)内存溢出 使用 csv.reader 逐行迭代,不用一次性 readlines

总结与效率提升建议

“怎么用脚本转换分隔符文本”这个问题,答案不是简单的“替换字符”,而是围绕数据完整性、编码、跨平台兼容性的系统方案。

推荐方案优先级

  • 普通场景:Python csv 库(最佳兼容性)
  • Linux 快速操作csvkitcsvformat
  • Windows 环境:PowerShell Import-Csv + Export-Csv
  • 避免使用:纯文本替换工具(sedawk)处理含引号的数据

效率技巧

  • 创建一次脚本,保存为 convert_delim.py,之后只需修改参数。
  • 在脚本中加入 argparse 参数解析,实现交互式选择分隔符。
  • 结合 glob 批量处理,加上 tqdm 进度条。

掌握脚本转换分隔符,等于掌握了数据流通的钥匙,下次遇到 .psv.ssv.prn 等奇怪格式,你也可以轻松应对。


延伸阅读:如果你需要更高级的功能(如自动检测分隔符、字段数据类型推断),可以研究 pandas.read_csv()csv-sniffer 库,它们能自动嗅探分隔符。

抱歉,评论功能暂时关闭!