怎么用脚本转换表格为文本

wen 实用脚本 1

告别复制粘贴:用脚本将表格秒变纯文本的高效指南(附Python与Shell实战)


📑 目录导读

  1. 为什么你需要“表格转文本”脚本?—— 从痛点场景到效率革命
  2. 核心原理拆解 —— 表格的“结构化”与文本的“线性化”逻辑
  3. Python + Pandas 处理复杂Excel/CSV(含代码与注释)
  4. Linux/Unix 下的纯Shell命令方案(不装任何第三方库)
  5. 进阶技巧:如何保留对齐、分隔符与处理超大文件?
  6. 高频问答(FAQ) —— 解决你实施时的90%困惑
  7. —— 让脚本成为你数据处理管线的一部分

为什么你需要“表格转文本”脚本?

在日常工作中,我们经常面临这样的“窘境”:刚从数据库导出的CSV表格,或者Excel里的数据透视表,需要粘贴到Word文档、邮件正文或者Markdown编辑器里,直接复制粘贴,轻则格式错乱(合并单元格、超宽列导致排版崩溃),重则数据中包含的逗号、制表符被错误解析,造成信息丢失。

怎么用脚本转换表格为文本

痛点场景举例:

  • 将数据库查询结果(mysql -e "select...")快速导入到运维告警通知中。
  • 将Excel的销售数据表转换为缩进文本,嵌入每日自动生成的报告邮件。
  • 从PDF复制表格时,行列错位,需要手动规整。

效率革命:通过一个简单的脚本,我们可以在5秒内完成人工需要5分钟整理的格式化工作,且零误差

核心原理拆解

表格是由“行”和“列”组成的二维矩阵,而文本是一维线性流,脚本的本质就是定义一种“扁平化”规则

  • 分隔符:用逗号()、制表符(Tab)或竖线()来区分不同列。
  • 行终止符:用换行符(\n)区分不同行。
  • 表头处理:决定是否保留第一行作为标题。
  • 引号规则:当单元格内含分隔符时,需用双引号包裹(遵循CSV规范)。

理解了这三个规则,无论是用Python还是Shell,你都能手写实现。

实战一:Python + Pandas 处理复杂Excel/CSV

Python是处理表格的首选武器,以下脚本适合包含中文、混合数据类型、需要特定排序的场景。

# convert_table_to_text.py
import pandas as pd
import sys
def convert(input_file, output_file, sep='|', header=True):
    """
    :param input_file: 输入的CSV/Excel路径
    :param output_file: 输出文本路径
    :param sep: 列分隔符,默认用竖线美观显示
    :param header: 是否包含表头
    """
    # 根据后缀读取文件
    if input_file.endswith('.xlsx') or input_file.endswith('.xls'):
        df = pd.read_excel(input_file)
    else:
        df = pd.read_csv(input_file, dtype=str)  # dtype=str防止ID变科学计数法
    # 处理空值(填充为空格或者 'NA')
    df = df.fillna('')
    # 核心:利用to_string关闭索引,并设置分隔符
    # 但to_string无法自定义分隔符,我们改用底层循环
    with open(output_file, 'w', encoding='utf-8') as f:
        if header:
            # 写入表头
            f.write(sep.join(df.columns) + '\n')
        # 写入数据行
        for idx, row in df.iterrows():
            # 将每个单元格转为字符串,并去除可能干扰分隔符的换行符
            row_str = [str(val).replace('\n', ' ').replace('\r', ' ') for val in row]
            f.write(sep.join(row_str) + '\n')
    print(f"转换完成!输出文件:{output_file}")
if __name__ == "__main__":
    # 用法示例: python convert_table_to_text.py input.csv output.txt
    convert(sys.argv[1], sys.argv[2])

运行效果:假如输入是两行三列的CSV,输出为: 姓名|年龄|城市 张三|28|北京 李四|35|上海

实战二:Linux/Unix 下的纯Shell命令方案

对于轻量级文本处理,完全不需要Python,利用awksed即可。

#!/bin/bash
# 将CSV文件转换为制表符分隔的文本
input_file=$1
output_file=$2
# 使用awk将逗号替换为Tab键分隔
awk -F',' 'BEGIN{OFS="\t"} {gsub(/ /,"",$0); print $1, $2, $3}' $input_file > $output_file
# 如果列数不确定,更稳健的做法是循环遍历
awk -F',' '{
    line=""
    for(i=1; i<=NF; i++){
        # 去除单元格首尾空格
        gsub(/^[ \t]+|[ \t]+$/, "", $i)
        line = line (i==1 ? "" : "|") $i
    }
    print line
}' $input_file > $output_file

注意事项:Shell方案对含有转义字符或逗号在引号内的复杂CSV支持不佳,若你的数据来自Excel导出,通常都是标准格式,此脚本完全够用。

进阶技巧:如何保留对齐、处理超大文件

  • 保留对齐:使用Python的str.ljust(width)方法进行左对齐填充,只需在上述代码中计算每列最大宽度,再填充即可。
  • 超大文件:如果文件超过1GB,Pandas一次性读取会内存溢出,请改用流式读取:
    import csv
    with open('big.csv', 'r') as f_in, open('out.txt', 'w') as f_out:
        reader = csv.reader(f_in)
        for row in reader:
            f_out.write('\t'.join(row) + '\n')
  • 规则文本转换成Markdown表格:只需将分隔符改为 ,并在第二行加入 即可生成Markdown语法。

高频问答(FAQ)

Q1:我的表格里面本身有逗号(北京,上海”),用逗号分隔会错乱怎么办? A:在生成CSV时,请确保该单元格内容被双引号包裹,在Python的csv库中会自动处理,但在Pandas中转文本时,需先执行df['col'] = df['col'].apply(lambda x: '"' + str(x) + '"')锁定。

Q2:脚本转换后,在Excel中打开文本文件,中文乱码了? A:由于Excel默认GBK编码,在写入文件时,指定encoding='utf-8-sig'(带BOM头)即可让Excel正确识别。

Q3:我只想提取表格中的某几列,怎么写? A:在Python的convert函数中,在读取DataFrame后添加:df = df[['第一列名', '第三列名']]即可。

Q4:有没有在线工具,不写代码就能转? A:有,但不建议数据敏感用户使用,你可以尝试本地化的ssconvert(Gnumeric工具)命令行:ssconvert input.xlsx output.txt,不过它输出的格式较为固定。

用脚本转换表格为文本,核心是明确分隔符规则处理边界情况,无论是Python的灵活强大,还是Shell的轻便快捷,都能让你从枯燥的复制粘贴中解放出来,建议先掌握Python方案,因为它更容易扩展(如结合邮件自动发送)。

将上述代码保存为table2text脚本,加入到你的~/.bashrc别名中,让效率工具随手可用,最好的脚本是“写完就不用再管它”的脚本,就把你手头那个乱糟糟的表格跑一下吧!

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