Правильно расщепление CSV-файла после повторения в пандах - PullRequest
2 голосов
/ 25 марта 2019

У меня есть CSV, содержащий 5000 строк, каждые несколько сотен строк CSV есть повторяющийся раздел.
Каков наиболее эффективный вариант разделения этого файла на несколько разных?

Внешний вид файлакак

Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
....
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2
....
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3

Мне нужно разбить его на несколько файлов по Header.И я понятия не имею, как я могу это сделать.Я пишу весь сценарий для обработки некоторых биологических вещей, но один из типов файлов (выше) создает проблемы, потому что это несколько файлов в одном.И скрипт не хочет с ним работать.

Я много читал о разделении файлов, но ничего не нашел о разделении после повторения значений в пандах.

Вв этом случае это будет 3 файла (но количество этих файлов в файлах варьируется)

1 Ответ

1 голос
/ 25 марта 2019

Я нашел немного лучшее решение, чем break утверждения, как я предложил в комментарии:

Вы можете создать список result и сохранить данные каждого чанка в отдельном элементе списка (например, в dict). Если вы читаете не заголовок строку, вы можете гарантировать, что только что прочитанная строка связана с текущим фрагментом данных. А текущий кусок данных является последним элементом в списке result, так что вы можете просто изменить его. Если вы читаете строку Header , вы просто добавляете новый элемент к result и начинаете записывать в него новые данные чанка.

Если размер содержимого постоянен, вы можете использовать итератор itertools.cycle, который "кодифицирует" ваш процесс анализа:

from itertools import cycle

text1 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
Header2
number of Samples2
Content2
a2, aa2, aaa2
b2, bb2, bbb2"""
size = 5
iterator = cycle(range(size))
result = []
for line in text1.split('\n'):
    i = next(iterator)
    if i == 0:
        result.append({'header': line})
    elif i == 1:
        result[-1]['num_of_samples'] = line
    elif i == 2:
        result[-1]['content_header'] = line
    elif i == 3:
        result[-1]['content'] = [line.split(', ')]
    else:
        result[-1]['content'].append(line.split(', '))

Если вы не знаете размер контента, вам следует проанализировать каждую строку, проверить ее тип и создать данные вручную:

text2 = """Header1
number of Samples1
Content1
a1, aa1, aaa1
b1, bb1, bbb1
b1, bb1, bbb1
Header2
number of Samples2
Content2
b2, bb2, bbb2
Header3
number of Samples3
Content3
a3, aa3, aaa3
b3, bb3, bbb3"""
result = []
i = 0
for line in text2.split('\n'):
    if line.startswith('Header'):  # Your condition for headers
        result.append({'header': line})
    elif line.startswith('number'):  # Your condition for number of samples
        result[-1]['num_of_samples'] = line
    elif line.startswith('Content'):  # Your condition for content headers
        result[-1]['content_header'] = line
    else:
        if 'content' not in result[-1]:  # We don't know is the content list created
            result[-1]['content'] = [line.split(', ')]
        else:
            result[-1]['content'].append(line.split(', '))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...