清理CSV - 开始新行

时间:2017-05-11 02:32:23

标签: python csv

抱歉这个愚蠢的问题。我不确定我是否只是累了或者什么,但我很难找到解决这个问题的逻辑。

我有一个看起来像这样的csv:

Company,CompanyName,
Website,WebsiteName ,
Website, WebsiteName2,
Email, emailData,
Company,NextCompanyName,
Website,websiteName,
Website, WebsiteName2,
Company,NextCompanyName,
Name,PersonName,
Website,websiteName,

正如您所看到的,这是非常令人讨厌的数据。我想要做的是读取整个CSV,并用CompanyName分隔每一行,并尝试组织尽可能多的数据。有时公司有一个人的名字,有时它有多个网站,有时是电子邮件,有时不是。

所以我想要的输出是: 公司名称,人名,电子邮件地址,Web1,Web2等

好消息是所有数据在每一行(公司,网站,名称等)都有一个分隔符。我想要做的是读取CSV,当它找到一个看起来像Company,CompanyName的行时,它会启动一个新行并对数据进行排序(Name to Name Column,email to emailColumn等等,直到它遇到另一个看起来像Company,CompanyName的行。

我不需要帮助读/写csv。我正在寻找有关如何正确迭代数据并将数据排序到需要的位置的帮助。

感谢你给我的任何建议

2 个答案:

答案 0 :(得分:1)

您可以在迭代文件行时检查记录开始条件。记录dict中的每个键/值对,当您看到开始时,您就知道现有记录已完成。您可以使记录中的值指向列表,并在找到它们时附加新值。

from collections import defaultdict
import csv
import re

filename = 'mytest.csv'

# test data
open('mytest.csv', 'w').write("""Company,CompanyName,
Website,WebsiteName ,
Website, WebsiteName2,
Email, emailData,
Company,NextCompanyName,
Website,websiteName,
Website, WebsiteName2,
Company,NextCompanyName,
Name,PersonName,
Website,websiteName,""")

# will hold dict for each company
records = []

with open(filename, newline='') as in_fp:
    record = defaultdict(list)
    for row in csv.reader(in_fp):
        if len(row) >= 2:
            if row[0].strip() == "Company" and "Company" in record:
                # found new company... record old as long as it has data
                records.append(record)
                record = defaultdict(list)
            record[row[0].strip()].append(row[1].strip())

for record in records:
    print('----')
    print(record)

答案 1 :(得分:0)

你可以使用一个简单的条件,并将所有内容排序到列表中,甚至是单个词典(尽管我认为这有点复杂,但并不多)

companyList = []
with open("foo.csv", "r") as f:
    for line in f:
        if "Company" in line:
            companyList.append(line.split(',')[1])

列出每个行的列表,然后按照你希望的方式重建你的csv,然后编写它。