Трудность чтения данных - PullRequest
0 голосов
/ 04 октября 2018

У меня есть CSV-файл следующим образом:

[8:3:1978] LOG [Sale:internals.py:makeSaleEntry:0] Entered with productid= 2327, storeid= 146, No.OfUnits= 1
[19:1:2007] LOG [Sale:internals.py:makeSaleEntry:1] Entered with productid= 1908, storeid= 202, No.OfUnits= 11
[22:4:2001] LOG [Sale:internals.py:makeSaleEntry:2] Entered with productid= 3072, storeid= 185, No.OfUnits= 16
[22:12:1915] LOG [Sale:internals.py:makeSaleEntry:3] Entered with productid= 1355, storeid= 177, No.OfUnits= 1
[19:8:1963] LOG [Sale:internals.py:makeSaleEntry:4] Entered with productid= 2235, storeid= 35, No.OfUnits= 16
[16:11:1997] LOG [Sale:internals.py:makeSaleEntry:5] Entered with productid= 1439, storeid= 141, No.OfUnits= 26

, и я прочитал файл с помощью df.

df = pd.read_csv('a.txt')

Я хочу построчно получить доступ к кадру данных и распечатать в другом файле csv productid, storeid и No.OfUnits следующим образом:

2327,146,1
1908,202,11
3072,185,16
1355,177,1
2235,35,16
1439,141,26

Мой кусок кодаis:

for i, row in df.iterrows():
    strr = ""
    for j, column in row.iteritems():
        seq = column.split('= ')
        strr = strr + seq[1] + ","
    file = open("a.csv", "a")
    file.write(strr[:-1]+"\n")
    file.close()

Этот код работает нормально, за исключением того, что он игнорирует запись первой строки (2327,146,1).Пожалуйста, предложите изменения.

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Решена проблема при чтении файла с использованием кортежей.

lines = tuple(open('a.txt', 'r'))
for line in lines:
    file = open("a.csv", "a")
    strr = line.split()
    file.write(strr[len(strr)-5] + strr[len(strr)-3] + strr[len(strr)-1] + "\n")
    file.close()
0 голосов
/ 04 октября 2018

Ваш код игнорировал первую строку, потому что по умолчанию read_csv предполагает, что это заголовок.Вы можете заставить свой оригинальный код работать, добавив header=None, как предложено выше.Возможно, вы также захотите рассмотреть более читаемую версию с использованием регулярных выражений для извлечения значений.

df = pd.read_csv('a.txt', header=None)
df['productid'] = df[0].str.findall('productid= ([0-9]+)').apply(lambda l: l[0])
df['storeid'] = df[1].str.findall('storeid= ([0-9]+)').apply(lambda l: l[0])
df['No.OfUnits'] = df[2].str.findall('No.OfUnits= ([0-9]+)').apply(lambda l: l[0])
df1 = df.loc[:, ['productid', 'storeid', 'No.OfUnits']]
df1.to_csv('a.csv', header=False, index=False, mode='a')

Кстати, панды для этого на самом деле не нужны.Это также будет работать:

import re
with open('a.txt') as f:
    values = [re.findall('productid= ([0-9]+), storeid= ([0-9]+), No.OfUnits= ([0-9]+)', 
                        line)[0] for line in f]
with open('a.csv', 'a') as f:
    for v in values:
        f.write(','.join(v) + '\n')
0 голосов
/ 04 октября 2018

Добавить заголовок = Нет параметра.

df = pd.read_csv('a.txt', header=None)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...