NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: Vyhledáváni a přeskakování v texťáku

V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Dog
Člen
Avatar
Dog:27.5.2016 3:03

Čau, mám poměrně rozsáhlej texták (asi 1300 stran) a potřebuji z nej vytahnout pár věcí jen nevím jak postupovat:
potřebuji tedy:
najít první "TableAnimati­on::dealPlayer­Cards"
poté hned první "MSG_0x0009-T" a pomocí ifstream >> air >> air >> air >> air >> cislo, načíst x tej údaj do stringu
poté hned následující "MSG_0x0007-T" a tam taky nacist par veci
a poté hned skočit na následující "TableAnimati­on::dealPlayer­Cards" (kdybych neskočil tak by mi to načetlo spoustu trashe, kterej nechci)

Možná je to už únavou, ale teď nejsem schopen nic vymyslet. Celej den jsem přemýšlel nad tím čeho se chytnout v tom texťáku a snažil se ho dešifrovat.

Díky moc za každou radu!

#include <iostream>
#include <fstream>
#include <string>
#include <cctype>

using namespace std;

int main ()
{
        ifstream ps;
        ps.open("C:\\Users\\Marek Schwarz\\Desktop\\PokerStars.log.0");
        if (!ps.is_open())
        cout << "Nahran log file!!!";

        string search0 = "MSG_0x0007-T";
        string search1 = "MSG_0x0009-T";

        string bazal = "TableAnimation::dealPlayerCards";

        string card0; //find0
        string card1; //find1
        int stack; //stack
        int bb; //bb
        int pos0; //pozice vyhledavani0
        int pos1; //pozice vyhledavani1
        string cislo0; //MSG_0x0007-T
        string cislo1; //MSG_0x0009-T
        string air; //nacteni nepotrebnych veci
        string karta0; //hole card0
        string karta1; //hole card1

       /* ps >> air >> cislo1 >> air;
        string net = ":::";
        if (air == net)
        ps>> karta0 >> air >> karta1;
*/

int i = 0;

while (!ps.eof()){
while(ps.good())
  {
    ps >> card0;
    pos0=card0.find(bazal);
    if(pos0!=string::npos){

        cout << card0 << endl;

        }

        ps >> card1;
    pos1=card1.find(search1);
    if(pos1!=string::npos){
        cout << card1 << endl;
        ps >> air >> cislo1 >> air;
        string net = ":::";
        if (air == net)
        ps>> karta0 >> air >> karta1;


    }


}

        cout << ++i << " ID1: " << cislo1 << ", hand: " << karta0 << karta1 << endl;
}
return 0;
}
 
Odpovědět
27.5.2016 3:03
Avatar
David Novák
Tvůrce
Avatar
Odpovídá na Dog
David Novák:27.5.2016 10:34

Na takovouto práci s textem obecně doporučuju použít regulární výraz. Ten ti to už přímo rozdělí na podčásti (můžeš si to rovnou naparsovat). Přičemž není problém načítat po částech z hlediska paměťových nároků.

Nahoru Odpovědět
27.5.2016 10:34
Chyba je mezi klávesnicí a židlí.
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Dog
Martin Dráb:27.5.2016 12:38

Pokud si chceš užít to vyhledávání více do hloubky, tak se mrkni na algoritmy vyhledávání v textu. Potřebuješ-li přímo na shodu, tak třeba Rabin-Karp (https://en.wikipedia.org/…rp_algorithm) nebo Aho-Corrasick (https://en.wikipedia.org/…ck_algorithm). Pokud ti nestačí hledat shodu, tak spíš zavítat do říše (konečných) automatů, což ale v podstatě vede na studium toho, jak se regexpy implementují (minimálně teoreticky).

Pokud si vyhledávání užít nechces, ale chtěl bys už mít výsledky, tak se zařiď podle Davida Nováka. 1500 stránek mi nepřijde jako moc co se týče paměťové náročnosti. Pár mega to asi bude, ale to obvykle netřeba řešit.

Nahoru Odpovědět
27.5.2016 12:38
2 + 2 = 5 for extremely large values of 2
Avatar
Dog
Člen
Avatar
Dog:27.5.2016 13:20

Díky, ale nevím moc dobře, jak to mám chápat...
Potřebuji vyhledat:

const string bazal = "TableAnimation::dealPlayerCards"; //první v textu
const string search0 = "MSG_0x0007-T"; // hned první za TableAnimation::dealPlayerCardsconst string a nacist par udaju zatím
const search1 = "MSG_0x0009-T";         // hned první za MSG_0x0007-T a nacíst pár udajů za tím
// poté hned přeskočit na další TableAnimation::dealPlayerCardsconst, ty dva údaje MSG za tím jsou nejdůležitější a mezi jednotlivými TableAnimation::dealPlayerCardsconst je mnoho MSG_0x0007-T a MSG_0x0009-T, ze kterých nic načítat necchci, jen z těch prvních dvou :-)
Editováno 27.5.2016 13:21
 
Nahoru Odpovědět
27.5.2016 13:20
Avatar
Dog
Člen
Avatar
Dog:27.5.2016 16:34

mám to!!!!!!!!!!
ted uz jen potřebuji, aby to otevřelo kopii toho textaku, protože se průběžně doplnuje a já chci ty data ve streamu (živě)... a nejlíp aby si to pamatovalo na jakym radku to skoncilo :)
tady si už ale vubec nevím rady

int i = 0;

while (!ps.eof()){
while(ps.good())
  {
        getline(ps, air);
        if (air == bazal){
                cout <<++i << ", Karty rozdany " << air << endl;

                while (air != search0){
                        ps >> air;
                        while(air == search0){
                                ps >> card0 >> card0 >> card0 >> karta0 >> card0 >> karta1;
                                cout << i << ", MSG_0x0009-T nalezen" << ", holecards " << karta0 << karta1 << endl;
                                break;
                        }

           }

                while (air != search1){
                        ps >> air;
                        while(air == search1){
                                ps >> card1 >> card1 >> card1 >> card1 >> card1 >> card1 >> card1 >> card1 >> card1 >> stack >> bb;
                                cout << i << ", MSG_0x0007-T nalezen" << ", stack " << stack << ", bb " << bb << endl;
                                break;
                        }

           }

           /*
            while (air != search1){
                cout <<i << ", MSG_0x0007-T nalezen " << air << endl;
                break;
           }
        }
        */




}

}

}
return 0;
}
 
Nahoru Odpovědět
27.5.2016 16:34
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.