我已经下载了英国慈善委员会的数据,这些数据以多个BCP文件的形式提供。我想为每个文件创建一个新的CSV文件,其中包含数据的干净副本。我有一个可行的解决方案,但我怀疑还有更好的方法。
首先要注意的是,它并不像将BCP文件读入带有适当定界符和行终止符的pandas CSV阅读器那样简单。 BCP文件的基础文本文件包含换行符,这会使CSV阅读器感到困惑。需要删除这些以获取正确的结果。
此外,由于定界符为@**@
,行终止符为*@@*
,并且由于有许多空字段,因此在文件中有一对彼此相邻的定界符并不罕见。可以读取为行终止符。
def bcp_converter(bcp_file, columns):
with open(bcp_file, 'r', encoding='Latin-1') as bcpfile:
with open(bcp_file[:-4] + '.csv', 'w+', encoding='Latin-1') as csvfile:
csvwriter = csv.writer(csvfile, delimiter=',')
csvwriter.writerow(columns)
temp_line = ''
for line in bcpfile:
temp_line = temp_line + (line.replace('\n', '')
.replace('\r', '')
.replace('
', '')
.replace('\x07\t', '')
.replace('@**@','%%')
.replace('*@@*', '\n'))
csv_data = [[string.strip() for string in item.split('%%')] for item in temp_line.split('\n')[:-1]]
temp_line = temp_line.split('\n')[-1] + ' '
for i in range(len(csv_data)):
csvwriter.writerow(csv_data[i])
csvfile.close()
此代码有效,并且运行速度不是很慢(在PC上大约需要1分钟30来转换约700MB的数据),但是我怀疑有一些方法可以使它变得更好。
作为旁注,在GitHub-https://github.com/ncvo/charity-commission-extract/上有一个公开可用的转换器。但是,尽管这样做工作得相当不错,但确实会犯一些错误(在某些情况下,传真列最终包含的字符串显然不是传真,并且试图将regno列设置为int值在熊猫中失败了)。这就是我决定自己写的原因。