首页 > 解决方案 > 如何使用python将大文本文件中的列拆分为3列?

问题描述

我有一个 1 GB 的文件。我想阅读它并将一列分成 3 个单独的列。

有一列 - COMPONENT_IDS ,我需要将其拆分为三个新列 - DOC_ID、DOC_TITLE、PROD

例子:

We have to split COMPONENT_IDS  into 3 columns (DOC_ID, DOC_TITLE, PROD) use ; as seperator. For a "##" seperator, it should come as multiple records
For example INK-MET-100 vs 300;INVOKANA - 100 vs 300 mg as a Starting Dose;Invokana##ENC-010864-13;INVOKANA PI and Med Guide - May 2014;Invokana

COMPONENT_IDS
INK-MET-100 vs 300;INVOKANA - 100 vs 300 mg as a Starting Dose;Invokana
ENC-010864-13;INVOKANA PI and Med Guide - May 2014;Invokana

DOC_ID                DOC_TITLE                                     PROD
INK-MET-100 vs 300    INVOKANA - 100 vs 300 mg as a Starting Dose   Invokana
ENC-010864-13         INVOKANA PI and Med Guide - May 2014          Invokana

标签: pythonpandasdataframe

解决方案


下面的 Python 脚本可能会对您有所帮助。您可以根据您的要求更改“format("DOC_ID", 40)" 等的整数值 40。下面的脚本正在读取您的数据文件并将其转换为 3 列并将其重定向到您的输出文件。通过在此处使用循环,我们可以避免高内存利用率问题。

$ cat test --> 原始文件

COMPONENT_IDS

INK-MET-100 vs 300;INVOKANA - 100 vs 300 mg 作为起始剂量;Invokana

ENC-010864-13;INVOKANA PI 和 Med 指南 - 2014 年 5 月;Invokana

$ cat test.py --> Python 脚本

将熊猫导入为 pd

fopen=open('test') # 原始文件

fout=open('output','w') # 输出文件

print('{: <{}}'.format("DOC_ID", 40),'{: <{}}'.format("DOC_TITLE", 60),'{: <{}}'.format("产品”,40),文件=fout)

对于我在 fopen 中:

    if i.startswith('COMPONENT_IDS'):

           continue

    else:

            (DOC_ID, DOC_TITLE, PROD)=tuple(i.strip().split(';'))

            print('{: <{}}'.format(DOC_ID, 40),'{: <{}}'.format(DOC_TITLE, 60),'{: <{}}'.format(PROD, 40),file=fout)

$ python3 test.py --> 脚本执行

$猫输出

DOC_ID DOC_TITLE 产品

INK-MET-100 与 300 INVOKANA - 100 与 300 毫克作为起始剂量 Invokana 在此处输入图像描述 ENC-010864-13 INVOKANA PI 和 Med 指南 - 2014 年 5 月 Invokana


推荐阅读