Avatar billede nidyahou Praktikant
08. februar 2004 - 11:29 Der er 14 kommentarer og
1 løsning

data fra " til "

hej, er der en måde hvorpå man kan finde værdien af noget mellem FX " til det næste "

FX: "birthe er en sød tøs," sagde hans og skævede over til sin far. Hvor output vil være: birthe er en sød tøs,
Avatar billede hrc Mester
08. februar 2004 - 14:11 #1
Den letteste måde (der ikke lærer noget fra sig) er at gå ind på

http://www.torry.net/db_text.htm

hvor det du skal lede efter er gratis komponenter der håndterer CSV (som er den engelske forkortelse for kommaseparerede filer). Der plejer også at være relativ letforståelige instruktioner om hvordan man installerer dem i Delphi.
Avatar billede hrc Mester
08. februar 2004 - 14:26 #2
const
  StringChar = '"';

Procedure GetQuotes(aSt : string);
var
  i,j : integer;
  bInString : boolean;
begin 
  bInString := false;
  for i := 1 to length(aSt) do begin
    if aSt[i] = StringChar then begin
      if bInString then // End of quotation
        MemoQuotes.Lines.Add(copy(aSt,j+1,i-2)) // Omit quotation chars
      else // Start of quotation
      j := i;
    bInString := not bInString;
  end; // for
end;

Denne kode fisker citaterne ud af en streng og propper dem over i en TMemo (ved navn MemoQuotes). Bemærk, at der går kludder i det hvis der kommer et anførselstegnene som ikke afsluttes - det er en forudsætning at teksten er korrekt formatteret!

Bemærk, at det er utestet kode, Jeg tror det virker, men det må du selv lege lidt med.
Avatar billede nidyahou Praktikant
08. februar 2004 - 14:55 #3
hvad hvis det ikke er " men et eller flere andre bogstaver??
Avatar billede hrc Mester
08. februar 2004 - 17:12 #4
Hvis du søger efter _DetteErEtCitat_BirtheErEnSødTøs_DetteErEtCitat_ hvor _DetteErEtCitat_ er separatoren, så må du bruge pos-funktionen.

Er det det du spørger efter, så havde det været flinkt af dig at skrive dit spørgsmål så man ikke sidder og programmerer til skraldespanden!

Prøv denne her:

Procedure GetQuotes(aSt, aQuoteSt : string);
var
  i,j,p : integer;
  bInString : boolean;
begin 
  bInString := false;
  repeat
    p := pos(aQuoteSt,aSt);
    if p > 0 then begin
      if bInString then // End of quote
        MemoQuotes.Lines.Add(copy(aSt,1,p-1))
      delete(aSt,1,p+length(aQuoteSt));
      bInQuote := not bInQuote;
    end;
  until p = 0;
end;
Avatar billede nidyahou Praktikant
08. februar 2004 - 17:19 #5
I'm sry :P det jeg skal bruge er det du siger hvis jeg gerne vil skrive en bestemt værdi ud f.x

navn:"lars"
kode:"larsjensen"

hvor jeg har en der kalder navn:" og til "
og så en der kalder kode:" og til "
Avatar billede hrc Mester
08. februar 2004 - 17:35 #6
Beklager selv - dum dag og så "flyver der en finke fra panden" sådan som det hedder i politikersproget. Rutinerne er skrevet med tanken at der godt kan være flere "citater" i samme streng -> derfor fyldes de over i en liste.

Antager:
st1 = 'navn: "lars"'
st2 = 'kode: "larsjensen"'

Begge rutiner vil skrive de korrekte værdier i memo'en:

GetQuote(st1);
GetQuote(st2);

resulterer i:

lars
larsjensen

Alternativt vil sidste eks. give samme resultat:

GetQuote(st1,'"');
GetQuote(st2,'"');


Hvis du kun har een oplysning i hver streng - og at den står sidst, så er det let:

function GetQuote(aSt : string) : string;
var
  p : integer;
begin
  result := '';
  p := pos('"',aSt); // Separator
  if p > 0 then
    result := copy(aSt,p+1,length(aSt)-p-1);
end;
Avatar billede nidyahou Praktikant
08. februar 2004 - 17:50 #7
men den nederste function kan jeg godt sætte ind, og så kalde med de eksempler du har gevet ovenover?
Avatar billede hrc Mester
09. februar 2004 - 10:32 #8
Det gør den hos mig, så jep brug du bare den.
Avatar billede nidyahou Praktikant
09. februar 2004 - 12:19 #9
men hvad hvis det er i samme streng de 2 værdier er... det er derfor jeg vil specificere den og sige navn=" istedet for "

btw, jeg har lagt mærke til at du er den mest dækkende ekspert på det her område så jeg tænklte om du ikke gad at tjekke mine andre spørgsmål ud ?? der er ret mange point at tjene :D
Avatar billede nidyahou Praktikant
09. februar 2004 - 12:31 #10
det er fordi jeg skal gennemgå en html kode og hvis jeg leder efter "-" så kommer der jo 100 millioner så er det mere overskueligt med den anden :)
Avatar billede hrc Mester
09. februar 2004 - 12:51 #11
Så må det jo være noget i retningen af:

const
  Token1 = 'navn:"';
  Token2 = 'kode:"';

procedure GetUsrAndPwd(aSt : string; var aUsr, aPwd : string);

  function GetToken(aToken, aSt : string) : string;
  var
    p : integer;
  begin
    result := '';
    p := pos(aToken,aSt);
    if p > 0 then begin
      delete(st,1,p+length(aToken)-1);
      result := copy(st,1,pos('"',st)-1);
    end; // if
  end;

begin
  aUsr := GetToken(Token1,aSt);
  aPwd := GetToken(Token1,aSt);
end;

... igen klapret ind uden at være testet, men da det ikke er rumfartsteknologi, så tror jeg på det.
Avatar billede hrc Mester
09. februar 2004 - 12:52 #12
Rettelse:
      delete(aSt,1,p+length(aToken)-1);
      result := copy(aSt,1,pos('"',aSt)-1);
Avatar billede nidyahou Praktikant
11. februar 2004 - 16:52 #13
jeg har lidt problemer med koden... gider du skære den ud i pap til mig, så lægger jeg 30 point oveni som ubndskylden for besværet :D
Avatar billede hrc Mester
12. februar 2004 - 15:32 #14
Jeg har lavet nedenstående testprogram som du selv kan lege lidt med.

Tag en TForm, plant en TEdit (her kaldet eText), en TButton (btnExtract) og to TLabel's (lUsrData og lPwdData). Bemærk at jeg laver alt til store bogstaver - resulterende i, at usr og pwd bliver store bogstaver (dette er strengt taget en fejl).

I knappens OnClick event kalder jeg:

  procedure GetUsrAndPwd(aSt : string; var aUsr, aPwd : string);

og her skal du fokusere på at de to sidste parametre aUsr og aPwd er var-parametre. Det betyder at retter man i deres værdier, så føres rettelserne med tilbage.

Hvis du skriver Dette er en test navn:"Hugo" og så mange andre dyr kode:"Hejsa" osv. osv, så leder proceduren efter 'navn:"' og 'kode:"' og returnerer "Hugo" og "Hejsa" (uden anførselstegn).

implementation

// En global procedure (vistnok kaldet en utility procedure)
procedure GetUsrAndPwd(aSt : string; var aUsr, aPwd : string);

  function GetToken(aToken, aSt : string) : string;
  var
    p : integer;
  begin
    result := '';
    aToken := UpperCase(aToken); // Token konverteres til store bogstaver

    // Returnerer indeks til første position i aSt hvor aToken er fundet -
    // ellers returneres 0
    p := pos(aToken,aSt);
    if p > 0 then begin
      delete(aSt,1,p+length(aToken)-1); // Slet tekst fra 1 til aToken (incl)
      result := copy(aSt,1,pos('"',aSt)-1); // Kopiér fra 1 til næste " (excl)
    end; // if
  end;

begin
  aSt := UpperCase(aSt); // Konverterer til store bogstaver.

  aUsr := GetToken('navn:"',aSt);
  aPwd := GetToken('kode:"',aSt);
end;

procedure TfrmMain.btnExtractClick(Sender: TObject);
var
  Usr, Pwd : string;
begin
  GetUsrAndPwd(eText.Text,Usr,Pwd); // Får Usr og Pwd retur med data
  lUsrData.Caption := Usr;
  lPwdData.Caption := Pwd;
end;
Avatar billede nidyahou Praktikant
12. februar 2004 - 22:43 #15
jeg takker mange gange for det flotte svar :D
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
Kurser inden for grundlæggende programmering

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