Я немного пытался найти способ в python заставить этот файл создать переход на новую строку после некоторого количества элементов (равного количеству столбцов, которые мне нужно будет добавить, что составляет 12) CSV в настоящее время выглядит как это.
текст первой строки выглядит так.
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
и я хотел бы, чтобы это выглядело примерно так
Продолжая, пока не будут заполнены все регистры в исходном файле.
Извините, я только что увидел ваш комментарий, я добавил часть необработанного текста, извините, что пропустил это в начале.
Первое, что я бы попробовал, это просто разделить строку на запятые и написать записи, используя csv.writer
, вызывая .writerow()
с двенадцатью элементами за раз. Я заметил, что у вас есть двойная кавычка в начале, но не позже, поэтому этот подход может быть почти достаточно хорошим, вам просто нужно удалить эту двойную кавычку. Конечно, если в тексте какого-либо поля в вашем файле есть запятые, мое предложение будет ошибочным, но это то место, с которого стоит начать, поскольку вы, похоже, пытаетесь исправить один конкретный файл, а не решить общую проблему.
Первое, что я бы попробовал, это просто разделить строку на запятые и написать записи, используя 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... идея лучше, чем та, что была у меня... Большое спасибо.
Вот подход 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'
, как в ответе Джоаниса.
Не могли бы вы вставить необработанные строки первого снимка экрана и вставить их в сообщение?