» »

[c#] preberi tekst ločen na dele

[c#] preberi tekst ločen na dele

japol ::

Kako preberem tekst iz .txt, ki je ločen z neko besedo?

Imam tekst:

dan:13
mesec:3
leto:2012
izvedba:da
=====
dan:18
mesec:7
leto:2012
izvedba:da
=====
dan:4
mesec:5
leto:2012
izvedba:ne
=====

Vsak tak vnos je ločen z "=====".

Kako preberem prvi del do "=====" ga vstavim v List, nato drugi del spet do "=====" in v novi List, itd... , ponavlja kolikor je bilo narejenih vnosov.

overlord_tm ::

beres po vrstico, vsako vstrico sparsas (split po :), vstavis v nek objekt/struct ki drzi en vnos. Ko naletis na vrstico ====, dodas vnos v List in zacnes na novo?

folfy ::

String x=new String();
String pom=new String();
List<String> v=new List<String>();
while(!file.eof)
{
    pom=file.getLine();
    if(pom == "=====")
    {
        v.add(x);
        x=new String();
    }
    else
    {
       x+=pom
    }

}


Nekaj v tem smislu, verjetno so napake ker sem na hitro nekaj napisav

darkolord ::

Ah ja

var list = tekst.Split("=".ToCharArray(), StringSplitOptions.RemoveEmptyEntries).ToList();


ali

var list = tekst.Split(new string[] {"====="}, StringSplitOptions.None).ToList();

Zgodovina sprememb…

  • spremenilo: darkolord ()

japol ::

Kaj pa če imam npr.:

dan:13
mesec:3
leto:2012
izvedba:da
==vmesna==
1
2
3
=====
dan:18
mesec:7
leto:2012
izvedba:da
==vmesna==
8
3
6
=====
dan:4
mesec:5
leto:2012
izvedba:ne
==vmesna==
3
3
5
=====

in vsak ta sklop do znaka ==vmesna== dati v en List, od ==vmesna== do ===== pa v drugi List

KrEn1234 ::

Če imaš dve listi, imaš šolski primer za implementacijo Strategy pattern-a. Za vsak naslednji novi "znak" dodaš dodatno vejo v strategijo.

Strategy pattern @ Wikipedia

Zgodovina sprememb…

  • spremenil: KrEn1234 ()

vorantz ::

v vsakem primeru je to čisto enako kot šolski primer razbijanja teksta po presledkih
samo da namesto presledka daš tvoj niz

darkkk ::

Eh bralne sposobnosti mam na psu.

Narediš lahko "dve fazi", najprej splitaš po sklopu "===vmesni===", ter nato po posameznih sklopih vsakega posebej.
string str = ... ; //sem noter prebereš text file;
string[] split1 = str.Split("===vmesni===");
List<List<string>> allLists = new List<List<string>>(); //tuki noter boš obesil vsako sekcijo po koščkih. V naprej ne veš kolk jih je.
for(int i = 0; i < split1.Length; i++){
    allLists.Add(new List<string>(split1[i].Split("====")));//če ne dela direkt v konstruktor je treba dodat range na roke v "podseznam"
}



Neki v tem stilu (ni pa to najhitrejše, ker greš "3x" čez podatke, 1. ko bereš, 2x ko splittaš), najhitreje je verjetno direkt parsanje z branjem vrstic.

Zgodovina sprememb…

  • spremenil: darkkk ()

japol ::

Na tak način imam že narejeno, ampak to naredi, da prvič v List vstavi do ==vmesna==, se pravi
dan:13
mesec:3
leto:2012
izvedba:da

ampak drugič pa vstavi od ==vmesna== do ==vmesna==, ker s for zanko nadaljuje in vstavi:
1
2
3
=====
dan:18
mesec:7
leto:2012
izvedba:da

itd.

moral bi pa ponovno štartati od =====

string sem prebral po vrsticah z:
StreamReader sr = new StreamReader(openFile1.FileName);
string[] vrste = sr.ReadToEnd().Split('\n');
sedaj pa moram razdliti na dele z ===== in ==vmesna==

darkkk ::

ok:
1. dej ti pokaži cel file, če nimaš neke pametne strukture, pol ...

2. pač splitaj najprej na "==break==", nato pa vse te dele splitaj na ====, vrži stran kar ne rabiš in zbindaj v list.

vorantz ::

ne...prvo mora po ====== pol pa ==vmesni==

ne vem pa zakaj ta vrstica string[] vrste = sr.ReadToEnd().Split('\n');
prvo split ======= pol split ==vmesni== in pol split newline v list

japol ::

Vsebina .txt je točno taka kot sem jo objavil.
S tem: string[] vrste = sr.ReadToEnd().Split('\n'); preberem vsako izmed vrstic, ločene so seveda z entrom (naslednjo vrstico).

Sedaj pa bi moral narediti nekako tako da vstavlja vrstice v List dokler ne pride do vrstice ==vmesna==, od ==vmesna== do ===== pa da vstavi v nek drugi List. ko doseže ===== pa ponovi postopek, spet vstavlja v List dokler ne pride do vrstice ==vmesna==,... in to ponavlja kolikor je teh sklopov.
Seveda mora vstavljati v Liste od začetka (od indexa [0] naprej).

Poskušal sem z:
for (int j = 0; j < vrste.Count(); j++)
                {
                    string posameznavrsta = vrste[j].ToString().Trim('\r'); 
//.Trim('\r') ker ko prebere vsako vrsto, zraven upošteva še enter (ne vem zakaj)
if (f != "==vmesna==")
                    {
                        lista.Add(f.ToString());
                    }
}

in to vnese pravilno za prvi vnos, to je:
dan:13
mesec:3
leto:2012
izvedba:da
ampak za vsak naslednji vnos (2., 3., 4.,...) pa vnese to:
1
2
3
=====
dan:18
mesec:7
leto:2012
izvedba:da
kar pa ne bo v redu, moral bi ponovno začeti od znaka =====

vorantz ::

vorantz je izjavil:

ne...prvo mora po ====== pol pa ==vmesni==

ne vem pa zakaj ta vrstica string[] vrste = sr.ReadToEnd().Split('\n');
prvo split ======= pol split ==vmesni== in pol split newline v list


string[] split1 = str.Split("======");
string[] split2;
foreach žnj in split1{
  split2 = žnj.split("==vmesni==");
  list1.addrange(split2[0].split("\n").tolist)
  list2.addrange(split2[1].split("\n").tolist)
}


neki tazga
kvazi psevdokoda :P preveri za vse funkcije kako morajo bit pravilno


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[c#] Majhen problemček

Oddelek: Programiranje
10937 (745) darkolord
»

C# pomoč pri razmišljanju

Oddelek: Programiranje
352225 (1369) urozz
»

C# Program

Oddelek: Programiranje
393029 (1952) Spura
»

[VB 2005] branje teksta

Oddelek: Programiranje
241602 (1270) mNeRo
»

[Naloga][Visul Basic] Program za izračun dimenzij soda...

Oddelek: Programiranje
101720 (1543) korenje_ver2

Več podobnih tem