Как конвертировать несколько наборов данных, идущих слева направо, сверху вниз, путем Pythonic? - PullRequest
0 голосов
/ 23 февраля 2011

Ниже приведен пример набора контактов для каждой компании, идущей слева направо.

ID Company ContactFirst1 ContactLast1 Title1 Email1     ContactFirst2 ContactLast2 Title2 Email2
1  ABC     John          Doe          CEO    jd@abc.com Steve         Bern         CIO    sb@abc.com

Как мне заставить их идти сверху вниз, как показано?

ID Company Contactfirst ContactLast Title Email
1  ABC     John         Doe         CEO   jd@abc.com
1  ABC     Steve        Bern        CIO   sb@abc.com

Я надеюсь, что есть Pythonic способ решения этой задачи.Любые указатели или образцы действительно приветствуются!

ps: в самом файле 10 наборов контактов, идущих слева направо, и таких записей несколько тысяч.Это файл CSV, и я загрузил в MySQL для манипулирования данными.

Ответы [ 2 ]

2 голосов
/ 23 февраля 2011

Вот несколько более чистая версия вышеупомянутого.Предполагается, что данные разделены запятыми.Типовые данные вместо этого имеют фиксированную ширину;Я предлагаю загрузить его в Excel или OpenOffice и сохранить как реальный CSV с разделителями-запятыми.

import csv

def main():
    infname  = 'contacts.csv'
    outfname = 'per_contact.csv'

    with open(infname) as inf, open(outfname, 'w') as outf:
        inCsv  = csv.reader(inf)
        outCsv = csv.writer(outf)

        inCsv.next()  # skip header row
        outCsv.writerow(['ID', 'Company', 'ContactFirst', 'ContactLast', 'Title', 'Email'])

        for row in inCsv:
            id_co = row[:2]
            for contact in (row[i:i+4] for i in range(2, len(row), 4)):
                if any(c.strip() for c in contact):  # at least one cell contains data?
                    outCsv.writerow(id_co+contact)

if __name__=="__main__":
    main()
1 голос
/ 23 февраля 2011

Это должно делать то, что вы хотите:

import csv

# The character that separates the fields in each row
field_delimiter = '\t'
# The number of fields for each contact
contact_fields = 4

# File in, file out
csv_in = csv.reader(open('foo.txt', 'r'), delimiter=field_delimiter)
csv_out = csv.writer(open('bar.txt', 'w'), delimiter=field_delimiter)

# Iterate through the file, breaking each line into "contact" sized chunks
# and spitting those chunks out as individual lines, into a new file.
for index, fields in enumerate(csv_in):
    # Set aside the company field, since it is shared by all of the contacts
    id = fields.pop(0)
    company = fields.pop(0)

    # Split the line into chunks containing the fields for each contact
    last = 0
    for i in [x for x in range(contact_fields -1, len(fields)+1) if x % contact_fields == 0]:
        # Join the fields back together using the appropriate delimiter, and write it
        # to the output file.
        csv_out.writerow([id, company] + fields[last:i])
        if index == 0:
            # This is the header line, only preserve the first set.
            break
        last = i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...