数据看起来像
212253820000025000.00000002500.00000000375.00111120211105202117
212456960000000750.00000000075.00000000011.25111120211102202117
212387470000010000.00000001000.00000000150.00111120211105202117
需要添加分隔符,如
21225382,0000025000.00,000002500.00,000000375.00,11112021,11052021,17
21245696,0000000750.00,000000075.00,000000011.25,11112021,11022021,17
21238747,0000010000.00,000001000.00,000000150.00,11112021,11052021,17
CSV文件长度高,将近20000行,有没有可能做
这个问题一般是关于阅读"固定宽度数据"的。
如果你被这些数据困住了,你需要逐行逐列解析它。我将向您展示如何使用Python完成此操作。
首先,您在注释中计算的列与示例输出不匹配。您似乎遗漏了计数为2个字符的最后一列。
您需要精确的列宽度来执行任务。我取了你的样本数据,并为你计算了列数,得到了这些数字:
8, 13, 12, 12, 8, 8, 2
那么,我们将逐行读取输入数据,对于每一行,我们将:
- 读取8个字符并保存为一列,然后13个字符并保存为一列,然后12个字符,等等…直到我们读取了所有指定的列宽度
- 当我们在行中移动时,我们将使用变量
beg
和end
来跟踪我们的位置,以表示列的开始(包括)和结束(不包括) - 第一列的末尾成为下一列的开始,依此类推
- 我们将把这些列存储在一个列表(数组)中,即新行
- 在行末,我们将新行保存到所有行 的列表中然后,我们将对下一行重复此过程
这是Python中的样子:
import pprint
Col_widths = [8, 13, 12, 12, 8, 8, 2]
all_rows = []
with open("data.txt") as in_file:
for line in in_file:
row = []
beg = 0
for width in Col_widths:
end = beg + width
col = line[beg:end]
row.append(col)
beg = end
all_rows.append(row)
pprint.pprint(all_rows, width=100)
all_rows
只是一个文本列表的列表:
[['21225382', '0000025000.00', '000002500.00', '000000375.00', '11112021', '11052021', '17'],
['21245696', '0000000750.00', '000000075.00', '000000011.25', '11112021', '11022021', '17'],
['21238747', '0000010000.00', '000001000.00', '000000150.00', '11112021', '11052021', '17']]
使用这种方法,如果列宽度或列数计算错误,可以很容易地修改Column_widths
以匹配您的数据。
从这里开始,我们将使用Python的CSV模块来确保CSV文件被正确写入:
import csv
with open("data.csv", "w", newline="") as out_file:
writer = csv.writer(out_file)
writer.writerows(all_rows)
和我的data.csv文件看起来像:
21225382,0000025000.00,000002500.00,000000375.00,11112021,11052021,17
21245696,0000000750.00,000000075.00,000000011.25,11112021,11022021,17
21238747,0000010000.00,000001000.00,000000150.00,11112021,11052021,17
如果您可以访问命令行工具awk,您可以像下面这样修复您的数据:
substr()
给出字符串$0
的一部分,即整行- 你从char
1
开始,然后指定第一列的宽度,8
- 对于下一个substr(),您再次使用
$0
,您从9
(从最后一个substr的1+8
)开始,并给它第二列的宽度,13
- 并对每一列重复,从"最后一列的开始加上最后一列的宽度"> 开始
#!/bin/sh
# Col_widths = [8, 13, 12, 12, 8, 8, 2]
awk '{print substr($0,1,8) "," substr($0,9,13) "," substr($0,22,12) "," substr($0,34,12) "," substr($0,46,8) "," substr($0,54,8) "," substr($0,62,2)}' data.txt > data.csv