Преобразование нескольких строк в столбце CSV в отдельные строки - PullRequest
0 голосов
/ 25 сентября 2018

Первые столбцы уникальны и имеют только одну запись.Следующие столбцы содержат несколько разрывов строк, и я хотел бы поместить все в свои отдельные строки.

Также в этих файлах содержится около 50 000 строк, которые необходимо будет циклически проходить по

Что у меня сейчас есть

Type, Animal, Age
Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59

К чему я стремлюсь

Type, Animal, Age
Animals,Dog,40
Animals,Zebra,26
Animals,Panda,18
Animals,Bear,59

Честно говоря, я понятия не имею, с чего начать, надеюсь, кто-то может привести меня в правильном направлении,Надеюсь, что смогу завершить его с помощью своего рода PowerShell, но открытым для всего.

Ответы [ 3 ]

0 голосов
/ 25 сентября 2018

выполните .split(',') для каждой строки в файле, затем выполните итерацию по списку, созданному как:

for i in list:
    i.split('\n')

, теперь у вас есть список, который должен выглядеть следующим образом:

list_line1 = [Type, Animal, Age]
list_line2 = [Animals,[Dog,Zebra,Panda,Bear],[40,26,18,59]]

таким образом, вам будет проще составлять списки ... так что вы просто вносите в него и сохраняете так, как вам нравится!

for animal in list_line2[1]:
    save the way you like it here!

я надеюсь, что это поможет

0 голосов
/ 25 сентября 2018

Поскольку ваш исходный файл csv не помещает кавычки вокруг полей с символами новой строки, файл необходимо открыть с помощью newline='\r\n', чтобы только \r\n обрабатывалось как символ новой строки, а \n само по себе не было:

import csv
from itertools import repeat

# assuming lines looks like
# Type, Animal, Age\r\n
# Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59\r\n

# specifically set newlines to '\r\n'
with open('file.csv', 'r', newline='\r\n') as fin:
    with open('new_file.csv', 'w', newline='') as fout:
        writer = csv.writer(fout)
        for line in fin:
            # manually split row
            row = line.rstrip().split(',')
            for newrow in zip(repeat(row[0]), row[1].split('\n'), row[2].split('\n')):
                writer.writerow(newrow)

Если ваш оригинальный CSV был правильно указан, ваш код будет выглядеть так:

import csv
from itertools import repeat

# assuming lines looks like
# Type, Animal, Age
# Animals,"Dog\nZebra\nPanda\nBear","40\n26\n18\n59"\r\n 

with open('file.csv', 'r', newline='') as fin:
    with open('new_file.csv', 'w', newline='') as fout:
        reader = csv.reader(fin, delimiter=',')
        writer = csv.writer(fout, delimiter=',')
        for row in reader:
            for newrow in zip(repeat(row[0]), 
                              row[1].split('\n'),
                              row[2].split('\n')):
                writer.writerow(newrow)
0 голосов
/ 25 сентября 2018
import itertools
raw = 'Animals,Dog\nZebra\nPanda\nBear,40\n26\n18\n59'
categories = raw.split(',')
result = zip(itertools.repeat(categories[0]),
             categories[1].split('\n'),
             categories[2].split('\n'))

print(result)  # >>> [('Animals', 'Dog', '40'), ('Animals', 'Zebra', '26'), ('Animals', 'Panda', '18'), ('Animals', 'Bear', '59')]

Некоторые предположения:

  • Формат постоянен (тип, сущность, возраст).
  • Я использовал python, так как вы пометили его.
  • Данные действительны (я не делал никаких проверочных тестов)
  • Окончательный вывод - список кортежей, каждый из которых содержит записи о животных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...