如何读取固定宽度的数据?



数据看起来像

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个字符,等等…直到我们读取了所有指定的列宽度
  • 当我们在行中移动时,我们将使用变量begend来跟踪我们的位置,以表示列的开始(包括)和结束(不包括)
  • 第一列的末尾成为下一列的开始,依此类推
  • 我们将把这些列存储在一个列表(数组)中,即新行
  • 在行末,我们将新行保存到所有行
  • 的列表中然后,我们将对下一行重复此过程

这是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的一部分,即整行
  • 你从char1开始,然后指定第一列的宽度,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

相关内容

  • 没有找到相关文章

最新更新