如何在Python中处理含分隔符的CSV文本列,实现正确列拆分
处理含内部分隔符的CSV拆分问题
问题背景
现有一份用_作为分隔符的CSV文件,其中TEXT列的内容包含分隔符_,且每行该列内的分隔符数量不固定,直接按_拆分会导致列结构混乱。原始数据示例:
ID_GROUP_TEXT_DATE_PART 101_group_1_此处有一些文本_23.06.2023_1 102_group_2_此处有一些_文本_23.06.2023_1 103_group_3_一些_文本_内容在此_23.06.2023_1 104_group_4_此处有一些文本_23.06.2023_1
需要将其拆分为固定列:ID、GROUP、TEXT、DATE、PART,预期结果如下:
| ID | GROUP | TEXT | DATE | PART |
|---|---|---|---|---|
| 101 | group_1 | 此处有一些文本 | 23.06.2023 | 1 |
| 102 | group_2 | 此处有一些_文本 | 23.06.2023 | 1 |
| 103 | group_3 | 一些_文本_内容在此 | 23.06.2023 | 1 |
| 104 | group_4 | 此处有一些文本 | 23.06.2023 | 1 |
解决方案
由于前两列(ID、GROUP)和最后两列(DATE、PART)的格式是固定的,可以通过拆分后截取固定位置的元素,合并中间部分的方式处理:
方法1:Python实现
# 读取并处理CSV内容 csv_content = """ID_GROUP_TEXT_DATE_PART 101_group_1_此处有一些文本_23.06.2023_1 102_group_2_此处有一些_文本_23.06.2023_1 103_group_3_一些_文本_内容在此_23.06.2023_1 104_group_4_此处有一些文本_23.06.2023_1""" lines = csv_content.splitlines() # 处理数据行 processed_rows = [] for line in lines[1:]: parts = line.split('_') # 提取固定部分 id_val = parts[0] group_val = f"{parts[1]}_{parts[2]}" date_val = parts[-2] part_val = parts[-1] # 合并中间部分为TEXT text_val = '_'.join(parts[3:-2]) processed_rows.append([id_val, group_val, text_val, date_val, part_val]) # 输出结构化结果 print("\t".join(["ID", "GROUP", "TEXT", "DATE", "PART"])) for row in processed_rows: print("\t".join(row))
方法2:awk命令行实现
如果习惯用命令行工具,可以用awk处理:
BEGIN {FS="_"; OFS="\t"} NR==1 {print "ID", "GROUP", "TEXT", "DATE", "PART"; next} { id = $1 group = $2 "_" $3 date = $(NF-1) part = $NF text = "" for(i=4; i<=NF-2; i++){ text = text $i (i==NF-2 ? "" : "_") } print id, group, text, date, part }
执行方式:将上述代码保存为process_csv.awk,然后运行
awk -f process_csv.awk your_file.csv
核心思路
- 识别固定格式的字段:
ID是拆分后的第一个元素,GROUP是拆分后的第2、3个元素拼接(格式为group_数字);DATE是倒数第二个元素,PART是最后一个元素。 - 中间所有剩余的元素用
_拼接,得到完整的TEXT列内容。
内容的提问来源于stack exchange,提问作者Andrey
相关产品推荐
相关产品推荐

