首页 > 解决方案 > 如果不满足条件,则在导入 txt 文件时合并行

问题描述

ROW_ID|Quote Number|Status|Status Reason ADT|Name|Account|Alias ADT|......etc 418 Columns

我有一个大的管道分隔文件,大约 200 万行 (2gs)。该文件应该每行有 418 列 (|),但是,许多行已不必要地拆分,导致导入数据时出现问题。

导入时,我想合并行,直到下一行中的管道数 == 418。

大多数问题发生在第 90 列,然后是一行 328。其他问题在 90 处拆分,然后是几行 0,然后是 328。理想情况下,所有这些行都将合并为一个。

例如,突出显示的行应该合并为一个(0 的行仍然包含信息

我曾考虑将不正确的行附加到列表中,然后将它们组合起来,但以每行 1 秒计算,这大约需要 26 天才能完成。

我也尝试在追加之前合并这些行,但恐怕我会遇到同样的效率问题。

%%time

correct = []
incorrect = []

with open('C:/Users/jschlajo/Desktop/export_all_quotes_compass.txt', 'r') as fh:
    for index, line in enumerate(fh):
        if index<20:
            if line.count('|')!=418:
                incorrect.append(line)

标签: python

解决方案


当您使用 Enumerate 时它会打开,它需要更长的时间。我删除了那部分代码,将所有问题行附加到一个列表中。与我预期的 26 天相比,它花了 34 秒。然后我加入了整个列表,并每隔 418 个管道拆分列表

correct = []
incorrect = []

with open('C:/Users/jschlajo/Desktop/export_all_quotes_compass.txt', 'r') as fh:
    for line in fh:
        if line.count('|')==418:
                correct.append(line)
        if line.count('|')!=418:
                incorrect.append(line)
                
                
test_1 = ' '.join(incorrect)                
i = iter(test_1.split('|'))


span = 418
words = test_1.split("|")
combined = ["|".join(words[i:i+span]) for i in range(0, len(words), span)]


推荐阅读