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.
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.
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;
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.
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;
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
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.
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.
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;
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.