【问题标题】:splitting data in python to form a table在python中拆分数据以形成表格
【发布时间】:2017-07-24 13:16:17
【问题描述】:

问题是:我有一个数据集要清理。我目前在 PyCharm(社区版)中使用 Python 3.6 作为解释器来解决这个问题。

我需要:

  1. 找到出现“代码”一词的行,然后
  2. 将以下所有行粘贴到一行中,直到
  3. 下一个词“代码”来了

这实际上会将数据分成 2 个字段,即;公司的代码和详细信息。

最终输出需要在文本文件中的表格中或通过 Pycharm 本身编写的 csv 中,这种格式很关键。

以下是输入(从实际文本文件中提取):

345- Code # 98882 +
"Ms, ABDUL RAFAY & COMPANY, +"
"907, 2nd Floor, tradeway Centre,33, Block-6, PECHS, Karach +"
Ph:345598 1334 558106 +
Mr. Abdul rafay Siddiqui +
347 Code # 96663 +
"Ms. BILAL & BROTHERS Plot No.F-8, Estate #2, Lalazar, Karachi Ph:322575.84 +"
Mr. Mubarak Shahid +
A23 - Code : BO229 +
"Ms. RAHMAN & SONS 303, 3rd Floor, Square One, Dundas street, Karachi P:36268947 +"
"Mr, Saleem Mughal +"
"349- Code # 93369 Ms, ALIAPPAREL +"
"Office No. 491/307, 1st  Floor, Blessings Tower near Tipu Burger , P?:34990456 +"
"Mr, Nasir Wali  +"

输出应该是这样的:

Code  -  Company details 
345- Code # 98882 + -"Ms, ABDUL RAFAY & COMPANY, +""907, 2nd Floor, tradeway Centre,33, Block-6, PECHS, Karach +"Ph:345598 1334 558106 +Mr. Abdul rafay Siddiqui +
347 Code # 96663 +  - "Ms. BILAL & BROTHERS Plot No.F-8, Estate #2, Lalazar, Karachi Ph:322575.84 +"Mr. Mubarak Shahid +

数据的关键是公司详细信息有时在一行或两行或三行中。因此,如果有一种方法可以迭代这些直到下一个“代码”出现。我之前在 R 中尝试过这个,但是除了添加 + 之外,我想不出任何具体的东西,这可以在这里去掉。

【问题讨论】:

标签: python


【解决方案1】:

您需要做的就是遍历文件,寻找表示新数据块开始的行。

这或多或少是你想要的:

def emit(lines, dest):
    if lines:
        print("".join(lines), file=dest)

company_data = []

with open('details.txt') as data_in, open('fixed_details','w') as data_out:
    for line in data_in:
        if "Code " in line: # start of a new company: output the previous one
            emit(company_data, data_out)
            company_data = []
        company_data.append (line.strip())
    emit(company_data, data_out)

它并没有完全做你想要的,因为你的示例输出有时会在公司代码和其余数据之间指定一个连字符,有时是一个连字符和一个空格。

345- Code # 98882 + -"Ms, ABDUL RAFAY ...(etc)
347 Code # 96663 +  - "Ms. BILAL & BROTHERS ...(etc)
                     ^ this is the space

345 行没有空格,但347 行有空格。您的示例输入数据中没有相应的空格,因此不清楚您希望程序做什么。我只是把连字符去掉了。我将把它整理出来(并提供标题)交给你。您可能需要更改 print() 调用以区分第一行数据和其余数据:

print(lines[0], "-", "".join(lines[1:]), file=dest)

这是输出:

345- Code # 98882 +"Ms, ABDUL RAFAY & COMPANY, +""907, 2nd Floor, tradeway Centre,33, Block-6, PECHS, Karach +"Ph:345598 1334 558106 +Mr. Abdul rafay Siddiqui +
347 Code # 96663 +"Ms. BILAL & BROTHERS Plot No.F-8, Estate #2, Lalazar, Karachi Ph:322575.84 +"Mr. Mubarak Shahid +
A23 - Code : BO229 +"Ms. RAHMAN & SONS 303, 3rd Floor, Square One, Dundas street, Karachi P:36268947 +""Mr, Saleem Mughal +"
"349- Code # 93369 Ms, ALIAPPAREL +""Office No. 491/307, 1st  Floor, Blessings Tower near Tipu Burger , P?:34990456 +""Mr, Nasir Wali  +"

【讨论】:

  • @BoarGules- 输出中的连字符仅描述了字段分隔。然而,在输入中它有时是否存在。我也会尝试
  • 我添加了一个替代的 print() 调用,它把连字符放在里面,前后总是有一个空格。
  • @BoarGules-我试过代码。似乎找不到写入的文件。不在工作目录或其他地方。只是为了确认'dest'是需要写入文件的目的地(我把Pycharm目录放在那里)......是的,我已经添加了“.txt”但仍然没有。虽然它正在读取 input.txt。
  • 您可能正在寻找以.txt 结尾的文件名。我无意中省略了扩展名。我也在使用 PyCharm,所以我知道输出最终与输入在同一个文件夹中。
  • @BoarGules- 它将输入文件读取为 data_in 。但是仍然没有写到我认为的任何地方..我更改了 dest 并将当前工作目录也放在那里。对吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-02
相关资源
最近更新 更多