Toon posts:

Delphi, vraag met zoeken op bepaalde tekens van woord

Pagina: 1
Acties:
  • 218 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
hoi

ik wil graag statistieken maken, daarvoor heb ik een naam en score in een tekstbestand op 1 regel. nu wil ik sommige van die scores optellen.
daarvoor heb ik allen nodig dat het if statement werkt op de eerste 5 tekens van de naam
ltc00 343
ltc00a 2345
ltc00bt 3643
ltc01 378
enzo...

moet dus worden ltc00 6331
ltc01 378

die moeten dus opgeteld worden.
ik heb in een andere topic bijna het antwoord gezien hier dusmaar kwam daar niet uit de ">" en "<" tekens en wel meer, want ben een newbie.
wie kan mij helpen :) want op chatboxen begrijpen ze me volgens mij niet eg ....

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je moet eens kijken naar de functie Copy en Length en je bestand regel voor regel inlezen dmv een TStringList of AssignFile en ReadLn. Daarmee moet je de code wel kunnen maken. Het topic waaraan je refereerd gaat over veel moeilijkere zaken dan dit.

We doen hier alleen gelukkig niet aan script requests, dus je zal zelf aan de gang moeten met deze informatie. Als je dan vast komt te zitten kan je je code posten en een gerichte vraag stellen. Veel success

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
copy had ik al gekeken... maar ik kreeg ui de delphi help niet echte info wat dat nou precies doet...
en ik doe het met readln.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Het geeft je de mogelijkheid een substring uit een string te halen. Dus in jouw geval alleen het begin (de eerste 5 tekens). Dat is stap 1.

Voor Stap 2 zou je een TStringList met Name/Value parameters kunne gebruiken.

We adore chaos because we like to restore order - M.C. Escher


  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 09-07 16:41

TheLunatic

Ouwe boxen.

Misschien is het een mogelijkheid om steeds de regel in een string te zetten (1), het deel achter de spatie te verwijderen (2), teken nummer 6 (3)en hoger verwijderen, en te bewaren in een array (4). Volgende regel hetzelfde, totdat er verschil optreedt. Dan ga je de waarden optellen.

1: ReadLn(tekstfile, sLTC);
2: sLTC:=Delete(sLTC, Pos(' ',sLTC), 10); (Niet zeker : Delete, procedure of functie ?)
3: sLTC:=Delete(sLTC, 6, 10); (idem als bij 2);
4: arLTC[i]:=sLTC; i:=i+1;

Beetje onduidelijk uitgelegd van mezelf :P

Mother, will they like this song?


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Probeer je in te houden TheLunatic :) Geen script requests en dus niet meteen al kant en klare code posten.

offtopic:
en Delete is geen functie maar iid een procedure

[ Voor 0% gewijzigd door LordLarry op 20-10-2002 20:06 . Reden: offtopic ]

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
beetje helpen mag wel, maar ik ga voorlopig met larry mee :)
eens kijken, ik heb nu dat ik dus
ltc00
ltc00
enzo onder mekaar krijg, dat is dus goed(alleen nog zonder gegevens, kan ik die niet met read eruit halen?), alleen geeft hij de 1e nog niet weer, ik krijg 1 minder dan regels dat ik heb. en ja ik heb de memo 1e regel weggehaald :)
nu moetik met Tstringlist verder gaan? (niet met read, zoals net al genoemd)?

  • jvdmeer
  • Registratie: April 2000
  • Laatst online: 22:35
Zorg er voor dat je de tekens 6 t/m 1e spatie wegknipt en in een TStringList plaats. Dan wordt de inhoud iets als:
ltc00 343
ltc00 2345
ltc00 3643
ltc01 378

Indien de namen op willekeurige volgorde staan, sorteer dan de lijst, zodat ze per '5-letter'-naam bij elkaar staan.

Vervolgens loop je de stringlist door en je onthoudt daarbij de '5 letter'-naam. Zodra de naam wijzigt, druk je het de som van de optelling af en zet het totaal weer op nul. Tijdens het doorlopen van de list tel je de waarde achter de spatie steeds op bij het vorige totaal.

Benodigde functie's: Zoek maar op in help:
TStringlist.strings[teller]
StrToInt
Pos
Copy

Verwijderd

Topicstarter
me gegevens
ltc00 453
ltc00ty4 1.022
ltc00ut 209
ltc01 4.553
ltc01j 342
ltc02 355

me code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var
   score: Integer;
   naam:string;
   ltc: textfile;
begin
  memo1.lines.clear;
  assignfile(ltc, 'c:\gb\file1.txt');
  reset(ltc);
  while NOt eof(ltc) do
  begin
    readln(ltc, naam);
  naam:=copy(naam,1,5);
    if (naam) = 'ltc00' then
    begin
      read(ltc,score);
      memo1.lines.add(naam+inttostr(score));
    end;
  end;
  closefile(ltc);


en hoe we ervoor staan. ik krijg nu wel alle namen door, en nietmeer de 1e niet, als ik het zo doe(met die if).
ik wil dus graag de scores erbij hebben, en die uiteindelijk optellen, maar als ik hem met read(moet toch voor integer), dan pakt hij hem niet..
omdat de scores niet elke keer op dezelfde afstand van het regelbegin staan is het lastig te werken met de stringlist, of heb ik dat niet goed gezien?
ik heb het boek van kerman, daar kijk ik in...

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Lees gewoon regel voor regel m.b.v. readln. Ga dan in deze regel zoeken wat je moet hebben.
Zoek m.b.v. pos() waar de spatie staat. Dan kan je zo je scores eruit filteren.

Kijk voor de gein eens in Delphi -> Help -> Index -> String Handling Routines voor een flink aantal functies om bewerkingen uit te voeren op strings (o.a. verwijderen, zoeken, omzetten naar getallen etc.)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

En voor het tellen zou je inderdaad kunnen sorteren zoals jvdmeer en TheLunatic voorstellen. Of je kan doen wat ik voorstelde en slaat het in een andere stringlist op in het formaat van:

ltc00=453
ltc01=62

daarbij kan je gebruik maken van de volgende properties TStringList.Values en TStringList.Names.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
morguh, zijn we weer :)
ik ben al blij met wat ik heb,maar het moet meer, en toch hang ik weer vast :(
ik heb nu in me memo staan 5 letter, en daarachter de cijfers.
ik heb de letters de variablele naam gegeven, en de cijfers score
nu is score wel nog een string, maar dat kan ik wel oplossen :)
wat wel een vraag is, maar het uit hoeveel tekens ik die string copy?(oftewel, of ik er 6 van maak, als er maar 3 tekens zijn..
en nog een vraag, ik heb komma's voor duizentallen, maakt dat uit?
dan gaan we door.
ik denk dat k het beste die nu kan inlezen vanuit de memo1. en omrekenen in de stap naar memo2. voor mij is dat denk ik het overzichtelijkst. want ik kom er niet uit hoe ik in de while not eof een goede optelling gemaakt krijg...
en hoe dat zit met jullie Tstringlist :S sorry maar, die help is zo onduidelijk als de pest. net als het boek waar misschien 5 regels erover instaan....
ze staan automatisch gesorteerd de namen, dus ik hoef hem alleen maar te lezen en kijken of hij ltc00 heet, maar nu is de vraag, hoe kanik dit doen, zodat ik niet voor elke ltc(want gaan t/m 30) een stuk moet typen, maar dat dat automatisch gaa. vdmeer zei al zoiets, van als hij verandert. maar ik weet het gewoon niet hoe het moet :(
help me nog effe aub

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Heb je de eerste stap kunnen doen? Kan je nu een regel inlezen met ReadLn en dan opdelen in lct00 (naam) en 453 (waarde)? Pas als je die stap af hebt kunnen we over naar de volgende.

Het is allemaal erg basic en je moet nu genoeg informatie hebben om het op te kunnen lossen. Je moet het alleen even doen. We doen hier niet aan script requests dus ik denk dat het hier ongeveer ophoudt. Todat je zelf met wat nieuws komt. Haal anders een Delphi boek van de bieb.

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
ja, we zijn weer wat verder, hij telt op, alleen een vaag ding, bij ltc00 doet hij het niet.
bij ltc01 lukt het wel :) dus dat betekend dat ik bijna klaar ben :) nu alleen voor alle 30 nummers een stukje code kopieren :) maar dan zit het in ieder geval in mekaar ;)
maar hoe kan dat dat hij het bij de eerst niet doet? (dat was dus ook de reden waarom hij het niet deed en ik dacht vast te hangen). zal de code afmaken, en hem dan nog effe posten

  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

een (array) index is zero-based. Huh, zero-wat? F1. Google. Begin bij het begin.

oogjes open, snaveltjes dicht


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Don Facundo schreef op 21 oktober 2002 @ 19:37:
een (array) index is zero-based. Huh, zero-wat? F1. Google. Begin bij het begin.
Huh??? sorry??
Delphi:
1
2
3
4
Blaat: array[1..100] of integer;
Blaat3: array[5..66] of integer
Blaat2: array[0..99] of integer;
blaat4: array of integer;

Ow.. dynamische array's zijn in Pascal altijd zero based. Voorgedefinieerde array's kunnen in pascal met elke willkeurige waarde beginnen. F1, Google. Begin bij het begin. ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
ik zal er eens naar kjiken, maar heb geen gebruik gemaakt van array;s :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Ik ook niet (meer) sst! ;)

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Betrapt Creepy op het gebruiken van Arrays binnen een OO taal! ;)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 30-08 09:55

Creepy

Tactical Espionage Splatterer

Glimi schreef op 22 oktober 2002 @ 08:40:
[...]

Betrapt Creepy op het gebruiken van Arrays binnen een OO taal! ;)
Niet iedereen is zo pure OO als jij ow almighty Glimi ;)

Ik wilde inderdaad nog linken daar dat stukje van jou over het gebruik van array's in OO talen.. kon dat zo snel niet vinden..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

Creepy schreef op 21 oktober 2002 @ 22:30:
[...]

Huh??? sorry??
Delphi:
1
2
3
4
Blaat: array[1..100] of integer;
Blaat3: array[5..66] of integer
Blaat2: array[0..99] of integer;
blaat4: array of integer;

Ow.. dynamische array's zijn in Pascal altijd zero based. Voorgedefinieerde array's kunnen in pascal met elke willkeurige waarde beginnen. F1, Google. Begin bij het begin. ;)
Ja :P, we hebben het hier niet over voorgedefinieerde array's maar o.a. een TStringList en ik zag em ook al Copy(naam, 1, 5) doen. Kan soms niet gewenste resultaten opleveren :/

oogjes open, snaveltjes dicht


Verwijderd

Topicstarter
oo, arrays of niet. ik blijft zitten met het komma probleem.. tenminste ik heb komma's in de getallen die ik inlees, die staan voor duizendtallen. hoe krijg ik dit verandert.
de rest van het programma loopt :)
tis wel een waslijst geworden
want voor elke naam heb ik 2 variablen gebruikt

score1:=copy(naam.6.5);
dan effe naar real die score 1 hier weggelaten
if (naa) is 'ltc00'then
score00:=score00+score1;
dit voor elke sore.......
dan voor elke score van floattostr
en dan voor elke score een memoutput
Maar! het werkt wel. krijg mooi lijstje, met scores die kloppen, mits ik de komma uit de tekst haal....

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Ja , we hebben het hier niet over voorgedefinieerde array's maar o.a. een TStringList en ik zag em ook al Copy(naam, 1, 5) doen. Kan soms niet gewenste resultaten opleveren
Met strings juist weer wel. Aangezien die wel 1 based zijn vanwege pascal. :p

[ Voor 0% gewijzigd door LordLarry op 22-10-2002 09:27 . Reden: quote ]

We adore chaos because we like to restore order - M.C. Escher


  • mulder
  • Registratie: Augustus 2001
  • Laatst online: 22:17

mulder

ik spuug op het trottoir

LordLarry schreef op 22 oktober 2002 @ 09:27:
[...]

Met strings juist weer wel. Aangezien die wel 1 based zijn vanwege pascal. :p
Ow ja... fijn al die talen die allemaal net weer anders doen.

oogjes open, snaveltjes dicht


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Verwijderd schreef op 22 oktober 2002 @ 09:24:
Maar! het werkt wel. krijg mooi lijstje, met scores die kloppen, mits ik de komma uit de tekst haal....
Das mooi. Kijk nog even in de help naar de string handlign routines. Daar vind je StringReplace

[ Voor 0% gewijzigd door LordLarry op 22-10-2002 09:33 . Reden: typo ]

We adore chaos because we like to restore order - M.C. Escher


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Of 'do it yourself' mbv Pos en Delete

We adore chaos because we like to restore order - M.C. Escher


Verwijderd

Topicstarter
gewoon gedelete dat gedoe :)
/edit
ik zie je bericht nu pas, ik had dat zelf bedacht :)
end edit/
gaan hem zo testen
ook geen komma last meer, wow het gaat echt lukken :)

Verwijderd

Topicstarter
ok, nog maar extra vraagje eraan vast plakken. want hij pakt hem niet, nu komt het omdat k excel niet zover krijg dat hij de een spatie maakt tussen de 2 dingen in :(
hoe krjig ik dit wel, of hoe krijg ik:
ltc00a1 1,499
ltc00hl 0
ltc00ou 617
ltc00pe 10,634
ltc00ph 8,247
ltc00rh1 1,404
ltc00rh2 3,351

wat dus op soort van TAB lijkt wel goed, kan ik dat in delphi meepakken, of moet k dan naar excel dingen gaan kijken, prn bestand geprobeerd, maar wilde ook niet :(

Verwijderd

Topicstarter
ik dank jullie allen, het werkt :)
Pagina: 1