Как получить шаблоны из повторяющихся файлов с несколькими строками - PullRequest
0 голосов
/ 12 февраля 2019

Я пытаюсь сделать Dataframe из текстового файла.Я использую код, который нашел в Интернете, но немного застрял и не знаю, как двигаться дальше.

PokerStars Hand # 135139509095: Холдем без ограничений ($ 0,25 / $ 0,50 USD)- 2015/05/13 2:26:41 ET

Стол 'Castafiore II' 6-max. Сиденье № 2 - это кнопка

Сиденье 1: Mastiksou855 ($ 50 в фишках)

Место 2: tiagosydney (67,98 долларов США в чипах)

Место 3: parisvii1986 (49,94 долларов США в чипах)

Место 4: Johnii141 (50 долларов США в чипах)

Место 5: DavidRandis ($ 36,59 в фишках)

Место 6: malabar357 ($ 50 в чипах)

* ОТКРЫТЫЕ КАРТЫ *

DavidRandis: звонки $ 0,50

malabar357: сгибы

Mastiksou855: сгибы

tiagosydney: повышает $ 1 до $ 1.50

parisvii1986: сгибы

Johnii141: сгибы

DavidRandis: звонки $ 1

* FLOP * [Jd 9c Tc]

* TURN * [Jd 9c Tc] [4s]

* РЕЗЮМЕ *

Всего по$ 3,75 |Рейк $ 0,17

Board [Jd 9c Tc 4s]

Место 5: DavidRandis собрал ($ 3,58)

Покер PokerStars # 135139512060: Безлимитный холдем ($ 0,25 / $ 0,50 USD) - 2015/05/13 2:26:52 ET

Стол «Артек II» 6-макс. Сиденье № 5 - это кнопка

Сиденье 1: Johnii141 ($ 50 в фишках)

Сиденье 2: MASSOS17 (40 долларов в чипсах)

Сиденье 4: jayceee16 (53,21 долларов в чипсах)

Сиденье 5: Mastiksou855 (50 долларов в чипсах)

Сиденье6: malabar357 ($ 50 в фишках)

malabar357: малые блайнды с постами $ 0,25

* КАРТЫ С ЛОЖКАМИ *

* РЕЗЮМЕ *

Общий банк $ 2.75 |Рейк $ 0,12

Board [7h Td Jc]

Место 1: Johnii141 (большой блайнд) фолд до флопа

Место 2: MASSOS17 собрано ($ 2,63)

Место 4: jayceee16, сложенное на флопе

Место 5: Mastiksou855 (кнопка), сложенное до флопа (не ставить)

Место 6: malabar357 (маленький блайнд), сложенное перед флопом

Это не полная покерная комбинация.Просто вставьте сюда две покерные руки в качестве примера, чтобы показать вам, как это выглядит.Пример с полными пятью покерными руками выложен здесь: https://ufile.io/y573n

def parse_file(line):
    tab1 = []
    with open(filepath,'r') as file:
        line = file.readline()
        while line:
            reg_match = _reglib(line)

            if reg_match.soft:
                soft = reg_match.soft.group()

            if reg_match.hand_id:
                hand_id = reg_match.hand_id.group(1)

            if reg_match.game_type:
                game_type = reg_match.game_type.group()

            if reg_match.sb:
                sb = reg_match.sb.group(1)

            if reg_match.bb:
                bb = reg_match.bb.group(1)

            if reg_match.date:
                date = reg_match.date.group(1)
                hour = reg_match.date.group(2)
                date_type = reg_match.date.group(3)
            line = file.readline()    
            if reg_match.table:
                table = reg_match.table.group(1)

            if reg_match.rake:
                rake = reg_match.rake.group(1)

            dict_of_data ={
                    'Soft' :soft,
                    'Hand_ID': hand_id,
                    'Game_type':game_type,
                    'SB':sb,
                    'BB':bb,
                    'Date':date,
                    'Hour':hour,
                    'Date_type':date_type,
                    'Table':table,
                    'Rake':rake
                    }
            tab1.append(dict_of_data)
            line = file.readline()        

    tab1 = pd.DataFrame(tab1)
    tab1.set_index(['Soft', 'Hand_ID', 'Game_type'], inplace=True)
    tab1 = tab1.groupby(level=tab1.index.names).first()


    return tab1


class _reglib:

    pat_soft = re.compile('Poker\w+')
    pat_hand_id = re.compile(r'#(\d+):')
    pat_game_type = re.compile('Hold\'em\s\w+\s\w+')
    pat_sb = re.compile('\$(\d+\.?\d+)/')
    pat_bb = re.compile('/\$(\d+\.?\d+)\s\w+')
    pat_date = re.compile('(\d+/\d+/\d+)\s(\d+:\d+:\d+)\s(C?ET)')
    pat_table = re.compile('Table\s\'(\w+...)\'')
    pat_seat = re.compile('(Seat\s\d):\s(\w+)\s\(\$')
    pat_rake = re.compile('Rake\s\$(...)')

    def __init__(self, line):
        # check whether line has a positive match with all of the regular expressions
        self.soft = self.pat_soft.search(line)
        self.hand_id = self.pat_hand_id.search(line)
        self.game_type = self.pat_game_type.search(line)
        self.sb = self.pat_sb.search(line)
        self.bb = self.pat_bb.search(line)
        self.date = self.pat_date.search(line)
        self.table = self.pat_table.search(line)
        self.seat = self.pat_seat.search(line)
        self.rake = self.pat_rake.search(line)


if __name__ == '__main__':
    filepath = 'test.txt'
    tab1 = parse_file(filepath)
    print(tab1)

Итак, проблема начинается, когда я ищу шаблоны во второй строке и так далее.Это информация таблицы (вторая строка) и информация о рейке (одна из последней строки).

Я не знаю, как это сделать по всем строкам.

Если я получу значение, сохраните его в фрейме данных, если шаблон не соответствует, сохраните None.Для каждого покера я хочу одну строку в фрейме данных, например: http://prntscr.com/mk2y4t

1 Ответ

0 голосов
/ 13 февраля 2019

Вам нужно использовать regex с pandas:

import re
import pandas as pd

data_pd = {'TypeOfRoom': [], 'HandId': [], 'TypeOfGame': [], 'SB': [], 'BB': [], 'Date': [], 'Hour': [], 'TimeZoneAbb': [], 'NoOfPlayers': [], 'Rake': []}
with open('file.txt', 'r') as f:
    data = f.read()
result = re.findall('(\w+) Hand #(\d+): (.*) \(.(\d+\.\d+)\/.(\d+\.\d+).*(\d\d\d\d\/\d\d\/\d\d).*(\d+:\d+:\d+) (\w+)', data)
rakes = re.findall('Rake \$(.*)', data)

s = re.findall('Seat (\d).*chips', data)
s = [int(x) for x in s]
seats = []
length = 1
for i in range(len(s)-1):
    if s[i+1] < s[i]:
        seats.append(length)
        length = 1
    else:
        length += 1
seats.append(length)

for r, rake, seat in zip(result, rakes, seats):
    data_pd['TypeOfRoom'].append(r[0])
    data_pd['HandId'].append(r[1])
    data_pd['TypeOfGame'].append(r[2])
    data_pd['SB'].append(r[3])
    data_pd['BB'].append(r[4])
    data_pd['Date'].append(r[5])
    data_pd['Hour'].append(r[6])
    data_pd['TimeZoneAbb'].append(r[7])
    data_pd['NoOfPlayers'].append(seat)
    data_pd['Rake'].append(rake)

df = pd.DataFrame(data_pd)

Вы получите:

enter image description here

...