Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 8 odgovora
  • 2.825 pregleda

Najnovija ↓

Citanje txt file i parsanje 08.09.2010. u 09:35 · pre 196 meseci
izmenjeno 1 put, poslednji put CallMeSaMaster 08.09.2010. u 10:29
  1. CallMeSaMaster08.09.2010. u 10:29zapis iz teksta poruke
#1
Pozdrav,

ovako: imam jednu datoteku tipa *.txt. U njoj se nalaze neki tekstualni podaci. Sama struktura izgleda ovako:

Code:

NazifFilea.dat

A00DE34XXXX XXXAFD

100 1255 234 222234455345 5435455 543545345 543545
fdsfdf9fds7z09fdsfds9

101 1255 321 434234234234 4234344 554345455 544555
ffhdsfsdfhsdfkodfsfkdk

102 1255 312 434243243344 4445554 545453234 543544
dsjdsdjdjfdkgjgkk0p4aa

hfsdfhdsdjfsdfjhsdfjhsdjfsdjfhsdjfddfds


Malo da pojasnim:

Prvi i treci red(drugi red je prazan) u datoteci su podaci o datoteci opcenito.
Peti red su neki podaci a sesti red je checksum tog petog reda.

Sedmi red je prazan.Na karaju svakog reda je <CR>i/ili<LF>.

Osmi i deveti su takodjer podaci i cheskum.
Deseti red opet prazan.

Jedanaesti i dvanaesti red opet isto : podaci i checksum tih podataka.

Trinaesti red prazan.

Zadnji red checksum cijelog file-a;
Ovi parova podaci-checksum moze biti neograniceno u datoteci.Tj mogu se ponavljati n puta.Sigurno je da dolaze uvijek u paru.

Ja sada zelim da uradim sledece:


1)Da procitam chesksum koji je na kraju file-a i da provjerim sadrzaj filea da li se poklapa sa tim checksum(Za ovo imam naravno algoritam tako da to nije prob.).
2)Da procitam svaki od tih podataka i da provjerim njegovu checksum.

Moze li mi neko pomoci kako to da uradim?

Hvala
Re: Citanje txt file i parsanje 08.09.2010. u 10:28 · pre 196 meseci #3
Mislim da je tvoj komentar suvisan!

Jasno je da je ovo forum i da ljudi traze pomoc i ako ne napisu uvijek "Moze li mi neko pomoci...?". Ali evo kad si tako ljubazan da pomognes ja cu editovati svoje pitanje.

U svakom slucaju hvala.
Re: Citanje txt file i parsanje 08.09.2010. u 10:37 · pre 196 meseci #4
Redovi koji se ne ponavljaju su zaglavlje fajla, i čitaju se jednom. Redovi koji se ponavljaju se čitaju u petlji dokle god ima št ada se čita. Mogao bi recimo ceo fajl da pročitaš sa File.ReadAllLines, i dobio bi niz stringova. Prvih par stringova rešavaš van petlje, ostalo rešavaš u petlji. Svaki string možeš da razdvojiš na sastojke sa String.Split koji takođe daje niz stringova. Ostalo je stvar algoritma, za koji reče da nije problem.

I da, izvini za ironiju. Mislio sam da je u pitanju neki od C/C++ foruma, a tamo pokušavam da usmerim ljude da postavljaju konkretna pitanja. Odgovor na višeznačno pitanje po prirodi stvari ne može biti konkretan, a da i ne govorimo o slučaju kad pitanja i nema. Ne znam koliko se na .NET forumu to toleriše.
Re: Citanje txt file i parsanje 08.09.2010. u 10:42 · pre 196 meseci #5
Problem je u tome sto je i zadnji red u fajlu samo jednom. Znaci prva tri i zadnji.

Kako da znam da znam na kojoj sam liniji i da nisam na zadnjoj?
Prvo bih trebao procitat zadnju liniju i cheksum uporediti sa sadrzajem file-a. Znaci procitat sve do zadnje linije i iz toga izvuci cheksum, a zatim uporediti. Ako je ok onda ici dalje.

Bio bih ti zahvalan ako bi imao neki kraci primjer :-)
Re: Citanje txt file i parsanje 08.09.2010. u 11:07 · pre 196 meseci #6
Code (csharp):

        private string checksum(string data)
        {
            //To do
            return "";
        }

        private bool verifyFile(string path)
        {
            //ucitavanje sadrzaja datoteke u listu stringova
            Stream s = File.OpenRead(path);
            StreamReader tr = new StreamReader(s);
            List<string> lines = new List<string>();
            while (!tr.EndOfStream)
            {
                lines.Add(tr.ReadLine());
            }
            tr.Close();

            //provera checksum-a celog fajla ovde
            //lines[lines.Count-1] <-- checksum celog fajla
            //if (checksumCelogFajla==true){
            //provera checksum-a podataka
            if (lines.Count > 5)//uslov da u file-u ima neshto vishe od opshtih informacija
            {
                for (int i = 5; i < lines.Count - 1; i += 3)
                {
                    string chksum = checksum(lines[i]);
                    if (chksum != lines[i + 1])
                        return false;
                }
            }
           //}
            else
                return false;

            return true;
        }
 


Ovo ti je otprilike kako bih ja uradio. U for petlji pochetna vrednost treba da bude prvi red od kog pochinje podatak. Ako nije 5, onda to promeni. Ne znam na osnovu chega radish checksum celog fajla, pa sam ostavio sam komentar na tom mestu, a shto se tiche checksum-a pojediinachnih linija, ovde je uradjeno da se on odredjuje u zasebnoj f-ji, ali ako je u pitanju neshto prosto, onda mozesh to da radish i unutar for petlje. I shta se deshava ako imash samo zaglavlje ? da nema podataka. Ako je checksum ispravan, onda verovatno treba da se vrati true. U tom sluchaju, ovde onda fali josh jedan if, oko provere checksum-a podataka (taj pod komentarom). I meni je prvo palo na pamet ReadAll, samo u ovoj klasi (ili TextReader-u) ima f-ja ReadAll, ali vraca string, a ne string[], pa bi to trebalo razdvajati, zato sam uradio preko liste.

PS. Mislim da je kljucna stvar u tome da prebacish sve podatke iz fajla u niz ili listu. Onda cesh moci da znash gde je zadnji red.
Re: Citanje txt file i parsanje 08.09.2010. u 11:23 · pre 196 meseci #7
Pošto metoda File.ReadAllLines (pogedaj je u MSDN-u) vraća niz stringova onda je lako uzeti poslednji string u to nizu:

String[] linije = File.ReadAllLines(@"ime_fajla.txt");
String poslednjaLinija = linije[linije.Length - 1];
Re: Citanje txt file i parsanje 08.09.2010. u 22:46 · pre 196 meseci #9
Da, to je istina. Ako je do par megabajta onda je dobar. Ako je više od 100 MB onda treba razmisliti da li ga čitati odjednom (moguće je, ali treba testirati performanse). Ako je preko 1GB onda ReadAllLines nije dobra ideja.
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme