【发布时间】:2022-01-12 05:56:54
【问题描述】:
背景
我有一个特定格式 (NEM12) 的大型 csv 文件,它太大而无法使用。文件格式如下;
- 文件始终以 100 开头
- 带有 200 的行表示新数据集的开始
- 300 或 400 的行表示数据集的数据
- 文件总是以 900 结尾
下面的例子
100 NEM12
200 NMI INFO INFO
300 20211001 0 0 0 0
400 20 20 F17
300 20211002 0 0 0 0
300 20211003 0 0 0 0
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
300 20211003 0 0 0 0
300 20211004 0 0 0 0
300 20211005 0 0 0 0
…
200 NMI INFO INFO
300 20211001 0 0 0 0
300 20211002 0 0 0 0
400 20 20 F17
300 20211003 0 0 0 0
300 20211004 0 0 0 0
900
我想做的事
我正在尝试将大文件拆分为数百个小文件。每个较小的文件将包含一个 200 行以及相应的 300 和 400 行的值。
我的尝试
我尝试通过 pandas 读取文件,但由于其形状不规则,没有奏效。
我已经成功地通过下面的代码遍历了行,但是它将每个值拆分到自己的列中(即,它不是 200,而是 2、0、0)。
感谢您的帮助。
for line in open(test):
if left(line, 3) == '200':
try:
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('900')
f_object.close()
except NameError:
print('ignore')
fname = str(line.replace(',', '').replace('\n', '')) + '.csv'
with open(fname, 'w', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow('100')
writer_object.writerow(line)
if left(line, 3) == '300' or left(line, 3) == '400':
with open(fname, 'a', newline='') as f_object:
writer_object = writer(f_object)
writer_object.writerow(line)
【问题讨论】:
-
towardsdatascience.com/… 和 geeksforgeeks.org/split-pandas-dataframe-by-rows 和 stackoverflow.com/questions/21800169/… 是初学者 - 您可以使用
200找到行的索引并使用iloc- 我不知道更多,但是这是一个开始。 -
您的原始 csv 文件的字段之间是否有逗号?
-
嗨@ferdy 是的,它的逗号分隔(即,200,NMI,INFO,INFO)。但在我的代码中,当我将行写入 csv 时,它会为每个单元格写入一个字符(2、0、0、N、M、I、...)
-
对了,我也看了nem12的技术资料。我会写函数来解决这个问题。