Вставить разрыв строки в файл python после фиксированного количества элементов для разделения столбцов в файле csv

Я немного пытался найти способ в python заставить этот файл создать переход на новую строку после некоторого количества элементов (равного количеству столбцов, которые мне нужно будет добавить, что составляет 12) CSV в настоящее время выглядит как это. enter image description here

текст первой строки выглядит так.

D276 ", 31386,10610 ,12122021 0010,12122021 00:00: 47840 85,0.00 + 842646, M000395708109323, Активные карты Check, 844-6593879, NY, 59655,84056, D27631718056, D27631386,10610, 122122021 00: 00: 59840Y00 5.36 -842647, M527021000201360, etsy.com - Thecraftyca Brooklyn, NY, 56995,840 6511011091718056, D276,8649529807, 12122021 00: 08: 22840N51,19.99-842648, M248747000103177, Google * YouTubePremium g.co/helppay# CA, 78295 , 840 6511016547548056, D276 2996910038, 12122021 00: 27: 1984022021 00: 27: 19840 57,11.30-842649, M000445474354997, Spotify, New York, NY, 48995,840 6511010952148056, D276 62521,21152,12122021 00: 28: 54840N51,5.40 -842650, M527021000211443, Google Play, Mountain View Ca, 58175,840 6511014173278056, D276,80278056, D276,802701,12122021 00: 30: 38840y00,49.67-842651, M235251000762203, M235251000762203, Amzn Mktp US, AMZN.com / Билл Ва, 59425840 6511010003058056, D276,114710,41280,12122021 00: 31: 22840z00,21,92-842652, M000445488848992, DD * Doordash McDonalds San Francisco CA, 58125,84056, D2761251756, D2761222021 00: 31: 50840Y05 0.00 + 842653, M145376000144509 ,PLAYSTATION NE Твирк, 800-345-7669 CA, 58165,840 6511020299078056, D27612517545529, 12122021 00: 32: 07840y57 21.44-842654, M145376000144509, PlayStation Network, 800-345-7669 CA, 58165 84056, D276, 125175,45529,12122021 00: 32: 08840y57 2: 32: 08840y57 21.44-842299, M5270210002299747, Playstationnetwork, San Mateo, CA, 58185,84056, D276129078056, D276,12517545529,12122021 00: 32: 09840Y57 21.44-842300, M527021000222747, PlaystationNetwork Сан-Матео, Калифорния, 58185,840 6511020299078056, D276,125175,45529,12122021 00:32:09840 57,0.00+842655,MCARD ACCPT IDC,Sony - Playstation N.. Сент-Луис,США,59655,760D 65910206 125175,45529,12122021 00: 32:2122021 00: 32: 27840y57 21.44-842301, M145376000144509, PlayStation Network, 800-345-7669 CA, 58165,840 6511020299078056, D276, 125175455291222021 00: 32: 28840Y57 21.44-842657, M527021000222747, PlaystationNetwork, Сан-Матео, CA, 58185,84056, D276125175455292122021 00: 32: 28840Y5721.44-842656, M527021000222747, PlaystationNetwork, San Mateo, CA, 58185,84056, D2762990780, 45529,12122021 00:32:29840 57,0.00+842658,MCARD ACCPT IDC,Sony - Playstation N.. Сент-Луис,США,59695,840 6511020299078056,D276,112802,40216,12122091 00,602:3 842659, M784959000762203, Amazon.com, Amzn.com / Билл WA, 59425,840 6511019112388056, D276,1204056, D276,12040744199,12122021 00: 35: 24840 05,3.12-67433, P536385810103481, Food Centre, Oakland, CA, 54115, 840 65110198410280519841028056, D276,12040744199, 122122021 00: 35: 48840 05,2.29-67434, P536385810103481, Фартов Продовольственный центр, Окленд, CA, 54115,840 6511019841028056, D276,12914347047,12122021

и я хотел бы, чтобы это выглядело примерно так

enter image description here

Продолжая, пока не будут заполнены все регистры в исходном файле.

Не могли бы вы вставить необработанные строки первого снимка экрана и вставить их в сообщение?

KarelZe 09.04.2022 15:37

Извините, я только что увидел ваш комментарий, я добавил часть необработанного текста, извините, что пропустил это в начале.

quiell 09.04.2022 16:34

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

joanis 09.04.2022 16:52
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
3
41
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Вот моя реализация этого предложения:

import csv

out_f = open("fixed-csv.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
    for line in in_f:
        fields = line.strip("\n\r").split(",")
        for position in range(0, len(fields), 12):
            writer.writerow(fields[position:position+12])

Теперь я заметил, что при запуске этого кода у вас на самом деле не ровно 12 столбцов в строке, это больше похоже на 10 или 11, и это не константа.

Вот вариант, который ищет D276 и делает его первым столбцом каждой строки:

import csv

out_f = open("fixed-csv-2.txt", mode="w")
writer = csv.writer(out_f)
with open("bad-csv.txt") as in_f:
    for line in in_f:
        fields = line.strip("\n\r").split(",")
        d276_positions = [
            i
            for i, value in enumerate(fields)
            if i == 0 or value == "D276"
        ]
        d276_positions.append(len(fields))
        for start, end in zip(d276_positions, d276_positions[1:]):
            writer.writerow(fields[start:end])

Я не думаю, что все ваши данные будут иметь D276 в качестве первого значения в строке, поэтому вам, возможно, придется изменить if i == 0 or value == "D276" на что-то, что в более общем смысле находит поле, которое помечает новую строку, но этот код должен настроить вас на это. нужно решить вашу проблему, предполагая, как я сказал в начале, что у вас нет запятых внутри каких-либо полей во всем вашем файле данных.

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

Сработало как волшебство... это была действительно хорошая идея - определить начало строк с помощью D276... идея лучше, чем та, что была у меня... Большое спасибо.

quiell 09.04.2022 20:26

Вот подход pandas + numpy.

import io
import numpy as np
import pandas as pd
data =""""
D276",31386,10610,12122021 00:00:47840 85,...
"""

df = pd.read_csv(io.StringIO(data), delimiter=",", quoting=3, header=None)

# resize array to multiple of cols
cols = 11
remainder = cols - df.shape[1] % cols
values = np.append(df.to_numpy(), np.empty((1,remainder)))

df_reshaped = pd.DataFrame(values.reshape((-1,cols)))

Выход:

0   1   2   3   4   5   6   7   8   9   10
0   D276"   31386   10610   12122021 00:00:47840 85 0.00+842646 M000395708109323    ACTIVE CARD CHECK   844-6593879 NY  59655   840 6511011091718056
1   D276    31386   10610   12122021 00:00:59840Y00 5.36-842647 M527021000201360    Etsy.com - TheCraftyCa Brooklyn NY  56995   840 6511011091718056    D276
2   86495   29807   12122021 00:08:22840N51 11.99-842648    M248747000103177    GOOGLE *YouTubePremium g.co/helppay# CA 78295   840 6511016547548056    D276    29969   10038

Обратите внимание, что разрыв после столбцов cols работает только для первых двух строк. Возможно, вы захотите рассмотреть другие критерии e. грамм. 'D276', как в ответе Джоаниса.

Другие вопросы по теме