Avatar billede hellfishdk Nybegynder
07. november 2008 - 21:32 Der er 10 kommentarer og
1 løsning

Blokvis inddeling af nyt string array

Jeg har et string array som jeg gerne vil kunne oprette et nyt array udfra.

array'en der skal tages fra har en opdeling:

aaaaaa
\n
\n
\n
bbbbbb
cccccc
dddddd
eeeeee
ffffff
gggggg
\n
\n
\n
hhhhhhh
iiiiiii
jjjjjjj
kkkkkkk
lllllll
mmmmmmm
.
.

Dvs. at x'erne er på array 0-index, derefter er newline på 1.-3.-index. a-f er på 4.-9.-index, efterfulgt af newline på 10.-13.-index. Og så fremdeles.
Jeg har en idé om at det skal være et for-loop der skal løbe blokkene igennem. A og b-f er fast, mens h-m er en blok for sig. Dog kan arrayet være længere med x antal blokke , som har samme indexstørrelse som b-f (altså 6).

Det jeg havde forestillet mig er at skulle ende med et string[] strArr = {{a}, {b-f}, {h-m}, {...}...};

Jeg håber min beskrivelse kan hjælpe til en løsning :)
(spørgsmålet bygger videre fra http://www.eksperten.dk/spm/850738)
Avatar billede kalp Novice
07. november 2008 - 22:23 #1
jeg forstod ikke noget:S
Avatar billede aaberg Nybegynder
08. november 2008 - 14:19 #2
Du bliver nok nød til at forklare dit spørgsmål lidt bedre! Kom eventuelt med lidt information om, hvad dette skal bruges til, da det ofte gør en problemstilling lettere at forstå.
Avatar billede hellfishdk Nybegynder
09. november 2008 - 13:13 #3
:)

Ok jeg prøver lige igen:

Jeg er ved at forsøge at lave en lille applikation som skal hente mit skema fra nettet. Jeg har en klasse for hver af undervisningsdagene hvor alt overflødigt html er fjernet, og som har en string (det er IKKE en array som jeg kom til at skrive) som er opdelt i den ovennævnte inddeling.

Jeg synes det er en lidt gnidret måde at skulle arbejde en sådanne string, så jeg vil gerne have hjælp til at lave en dynamisk array, hvor indholdet er varierende. Dvs. at der enten er skemalagte lektioner den pågældende dag, eller ingen.

Jeg håber det fik kastet lidt lys over hvad jeg er ude efter :)
Avatar billede hellfishdk Nybegynder
09. november 2008 - 13:17 #4
Et eksempel på en string kunne se sådan ud:

mandag



Fag
Undv.type
fra kl.
til kl.
Uge(r)
Lokale


fag1
Storhold
8:00
9:50
36-38, 41, 43-49
SP113 IBM Aud.


fag2
Øvelser
13:30
15:20
38-41, 43-47
K150
Avatar billede wster Nybegynder
10. november 2008 - 21:36 #5
Jeg tror nok jeg ved hvad det er du vil og hvis det er tilfældet er der en meget nem måde at opnå dette på i C#.
På den string som indeholder fagene kører du metoden .Split som opdeler din string i flere substrings udfra nogle seperatorer du vælger. Så vidt jeg kan se har du kun én seperator, nemlig "\n\n\n".
Derfor kan det gøres så nemt som:
string[] arr = text.Split(new string[]{"\n\n\n"}, StringSplitOptions.None);
Hvor text er den string som indeholder fagene og arr er det færdige opdelte array. Hvis du har flere seperatorer end "\n\n\n", initialiserer du naturligvis først dem som et string array og anvender det som parameter i stedet for new string[]{"\n\n\n"}.
Avatar billede hellfishdk Nybegynder
12. november 2008 - 13:06 #6
jeg har lavet den med char[] i stedet for
   
string[] skemaDag = strippedRawSkema.Split(new char[] { '\n', '\n', '\n'}, StringSplitOptions.None);

På følgende index er:
dag          : 0
Overskrift  : 4 - 9
Fag 1        : 12 - 17
Fag 2        : 20 - 25

Jeg har lavet en arraylist, som gemmer overskriften, som er fast:
for (int i = 4; i < 10; i++)
            {
                overskrift.Add(skemaDag[i]);
            }

Men hvad gør jeg så når jeg har X antal fag, og vil have dette i et arraylist for sig:

    fx. arraylist fag1 = new arraylist;

Jeg skal på en eller anden måde have talt hvor mange "blokke" der er. Hvor en blok er lig med 6.

Jeg håber virkelig der er nogen der kan hjælpe, for det er den største hurdel jeg skal over :)
Avatar billede aaberg Nybegynder
12. november 2008 - 13:24 #7
First things first:

string[] skemaDag = strippedRawSkema.Split(new char[] { '\n', '\n', '\n'}, StringSplitOptions.None);

Denne kodelinje giver ingen mening. Hvis du bruger Split metoden med en char, skal du angive en liste over alle de tegn den skal søge efter. I dit eksempel angiver du at hvis tegnet er '\n' eller '\n' eller '\n' skal den splitte. Hvis du vil have den til at splitte når der er præcist 3 mellemrum, skal du bruge:

string[] skemaDag = strippedRawSkema.Split(new string[] { "\n\n\n"}, StringSplitOptions.None);


Hvis en blok har 6 pladser i arrayset, kan du finde ud af hvor mange blokke der er ved at skrive:

int antalBlokke = skemaDag.Length / 6;
Avatar billede hellfishdk Nybegynder
12. november 2008 - 17:06 #8
jeg kan ikke få det til at virke med en new string[]{"\n\n\n"} - jeg får bare det samme output som 4 kommentar opad, når jeg laver en array søgning på skemaDag[0]. Men hvis jeg bruger new char[] { '\n', '\n', '\n'} - kan jeg søge fint i arrayet.

Jeg har endda forsøgt at RegEx.Place(strippedRawSkema, "\n\n\n", "Ø") (hvor Ø bare skal markerer hvor der er \n)- uden at der bliver ændret noget i output. Men hvis jeg laver en replace med "\n", så kommer der Ø på alle \n-pladser.
Avatar billede wster Nybegynder
12. november 2008 - 17:08 #9
Som aaberg skriver opdeler du lige nu din string pr. linie [selvom .Split(new char[] { '\n', '\n', '\n'}, StringSplitOptions.None) er det samme som .Split('\n')].

Det kan godt være at det er smart for dig at have hver linie i et array, således du kan hente navnet på faget på en specifik placering, men du bør overveje om det ikke er bedre først at opdele stringen i blokke og derefter opdele den blok i linjer.

Hvis det gælder at der altid er 3 linieskift mellem hver blok, vil jeg foreslå at du først bruger:
string[] skemaDag = strippedRawSkema.Split(new string[] { "\n\n\n"}, StringSplitOptions.None);
Nu indeholder dit array nogle blokke med tekst, en enkelt blok kunne f.eks. være
Fag
Undv.type
fra kl.
til kl.
Uge(r)
Lokale

Herefter kan du så iterere igennem alle blokkene og lave en ny opdeling. eks.
string[] blok;
string[] skemaDag = strippedRawSkema.Split(new string[] {"\n\n\n"}
for(int i = 0; i < skemaDag.length; i++)
{
    blok = skemadag[i].split('\n');
    //her indsættes eventuel behandling af blokdata
    //f.eks.
    list.Add(new Fag(blok[0], blok[1], blok[2], blok[3], blok[4], blok[5]));
}
(Start eventuelt med i = 1, hvis første blok repræsenterer ugedagen).
blok[0] vil så være titlen på faget hvis det kommer først, blok[1] aktiviteten osv. Fordelen ved at gøre det på denne måde er det det skaber overskuelighed og hvis en blok pludselig består af andet end 6 linjer - lad os eksempelvis sige at der kan komme en kommentar på til sidst - forstyrrer det ikke ordenen på de andre blokke.
antallet af blokke/fag svarer til length på Skemadag.

En anden måde er at opdele arrayet på, er den måde, som du tilsyneladende er i gang med, hvor stringen opdeles pr. linie. Denne metode gør at stringen kun skal splittes én gang, men bliver besværlig at implementere, hvis ikke hver blok er på seks linjer. Det kunne eksempelvis se således ud:
string[] skemaDag = strippedRawSkema.Split('\n');
for(int i = 0; i < skemaDag.lenth; i+=8)
{
    //her indsættes eventuel behandling af blokdata
    //f.eks.
    list.Add(new Fag(skemaDag[i], skemaDag[i+1], skemaDagk[i+2], skemaDag[i+3], skemaDag[i+4], skemaDag[i+5]));
}
(Start eventuelt med i = 3 hvis første linje er ugedagen)
Læg mærke til at i inkrementeres med 9, det sker fordi der i skemaDag arrayet vil optræde 2 tomme strings på grund af de extra 'new line' ved siden af hinanden. Her repræsenterer skemaDag[i] titlen, skemaDag[i+1] aktiviteten osv.
Antallet af blokkke/fag svarer til  length på skemaDag / 8
8 fordi hver fag består af 6 linjer og har 2 tomme linjer til sidst. Dette antal bliver dog forkert hvis det sidste fag i stringen ikke afsluttes af de extra linjer. Afhjælp eventuelt dette ved at lægge to til længden på skemaDag ((skemaDag.length + 2) / 8).

Jeg går, i disse eksempler, ud fra at du ønsker at bruge al dataen fra et enkelt fag i hver omgang af for-løkken (som i eksemplet til at lave dataobjekter og smide disse i en liste), hvis du blot vil udskrive disse linjer, kan du lave et normalt gennemløb og udskrive hver linje.
Avatar billede hellfishdk Nybegynder
12. november 2008 - 23:27 #10
Det var lige akkurat det gennembrud jeg havde brug for :D

min string strippedRawSkema havde ikke kun \n, men \r\n. Hvilket betyd at jeg ikke kunne få spliit til at virke. Men nu viker det og jeg kan nu trække dynamisk indhold.

wster smider du svar?
Avatar billede wster Nybegynder
13. november 2008 - 08:49 #11
Det kan du tro.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester