Avatar billede henge Nybegynder
16. januar 2007 - 13:51 Der er 16 kommentarer og
1 løsning

udtage en del af string

Jeg skal udtage en del af denne string.
MFG:Roland;CMD:RTL,RDGL3,PJL,DW_PCL;MDL:SP-540V;CLASS:PRINTER;VER:6.00;STATUS:4008800050515253111100008500000000000171700;EXTRA_STATUS:000C800C800C800C8000000000085000000000;SN:ZS70137;SEH:0,1,1;

Jeg skal kun bruge det mellem EXTRA_STATUS:
til den afsluttende ;
Derefter skal jeg denne streng deles op i 5 dvs.
000C8
000C8 osv.
evt. gemmes som fil, men den kan jeg selv finde ud af.

Håber der er nogen der kan hjælpe
Avatar billede stoney Nybegynder
16. januar 2007 - 13:54 #1
Øhh, hvor står EXTRA_STATUS ?

Er du sikker på du har fået postet det hele ?

Stoney
Avatar billede dkn Nybegynder
16. januar 2007 - 14:05 #2
procedure TForm1.Button1Click(Sender: TObject);
var
fstr: string;
I : integer;
begin
fstr := edit1.Text;

if pos(';EXTRA_STATUS:', fstr) <> 0 then
begin
  fstr := copy(fstr, pos(';EXTRA_STATUS:', fstr)+14, length(fstr));
  fstr := copy(fstr, 0, pos(';', fstr)-1);

  //- split
  I := 1;
  while I < length(fstr) do
  begin
    memo1.Lines.Add(copy(fstr, I, 5));
    I := I +5;
  end;
end else
showmessage('Kunne ikke finde EXTRA_STATUS');
end;

edit1 text indeholder her det text. Output til en memo1
Avatar billede hrc Mester
16. januar 2007 - 14:06 #3
Med en TStringList kan separere de enkelte elementer hvorefter det vil være let at fiske 000C8 ud af det sidste element.

Hvilken Delphi bruger du? Der er nemlig forskel mellem D7 og D2006
Avatar billede hrc Mester
16. januar 2007 - 14:21 #4
dkn: Jeg tillod mig at digte videre på dit eksempel:

procedure TForm1.ExtractTokens(aString : string; aList : TStrings);
const
  SearchToken = 'EXTRA_STATUS';
var
  p, i : integer;
begin
  aList.Clear;
  p := pos(SearchToken, aString);
  if p > 0 then
  begin
    // bruger MaxInt idet det antages at være sidste segment i strengen
    aString := copy(aString, p + length(SearchToken) + 1, MaxInt);

    i := 1;
    while i < length(aString) do
    begin
      aList.Add(copy(aString, i, 5));
      inc(i);
    end;
  end;
end;
Avatar billede hrc Mester
16. januar 2007 - 14:22 #5
inc(i,5); // En genetisk defekt får mig at foretrække inc() i stedet for i := i + 5;..
Avatar billede henge Nybegynder
16. januar 2007 - 15:06 #6
Jeg har delt strenge op for det hele kom vist ikke med.
Men return string fra printeren er en hel streng.

MFG:Roland;CMD:RTL,RDGL3,PJL,DW_PCL;
MDL:SP540V;
CLASS:PRINTER;
VER:6.00;
STATUS:4008800050515253111100008500000000000171700;
EXTRA_STATUS:000C800C800C800C8000000000085000000000;
SN:ZS70137;SEH:0,1,1;
Som i kan se afsluttes hver sektion med ;
Jeg ser på jeres svar i morgen tidlig og tildeler point ;-)
Avatar billede henge Nybegynder
17. januar 2007 - 08:45 #7
Takker for hjælpen
Avatar billede hrc Mester
17. januar 2007 - 09:54 #8
Hvis du gerne vil have hvert element separeret i en liste, så kan du bruge TStringListen således:

http://www.eksperten.dk/spm/715997

Der er en lille krølle hvis du kører D2006 for så skal der sættes endnu en property før det virker. Kan ikke lige huske hvad den hedder, men uden den virker det ret "!///&#%/
Avatar billede henge Nybegynder
17. januar 2007 - 10:26 #9
Mange tak, var lige ved at se på det.
mit problem er at min streng kun er på en linie.
Jeg tror at det er derfor koden ikke virker ordentlig
sådan kommer min fil til at se ud:
MFG:Roland;CMD:RTL
RDGL3
PJL
DW_PCL;MDL:SP-540V;CLASS:PRINTER;VER:6.00;STATUS:4008800050515253111100008500000000000171600;EXTRA_STATUS:000C800C800C800C8000000000085000000000;SN:ZS70137;SEH:0
1
1;

så strengen bliver ikke seperaret ordenligt efter ;
Avatar billede hrc Mester
19. januar 2007 - 09:19 #10
CommaText var forkert - prøv med dette her. Det virker hos mig:

procedure TForm1.btnDoItClick(Sender: TObject);
var
  Fields : TStringList;
begin
  Fields := TStringList.Create;
  try
    Fields.Delimiter := ';';
    Fields.StrictDelimiter := true;
    Fields.DelimitedText := eInput.Text;
    lbOutput.Items.Assign(Fields);
  finally
    Fields.Free;
  end;
end;

// eInput er en TEdit og lbOutput er en TListBox
Avatar billede henge Nybegynder
19. januar 2007 - 09:38 #11
Takker, men jeg får undeclaret identifier StrictDelimiter
Avatar billede hrc Mester
19. januar 2007 - 11:56 #12
Så fjern du bare den. Det er noget der kom med i D2006 (måske D2005)
Avatar billede henge Nybegynder
19. januar 2007 - 12:53 #13
Ok now we are talking.

Kan du hjælpe mig med at få (kun værdierne) ud dvs.
MFG:Roland;
bliver til Roland osv.
Derefter vil jeg gerne have værdierne i variabler
hvis du vil såkan jeg oprette et nyt spørgsmål til 100 point
Avatar billede kroning Nybegynder
19. januar 2007 - 18:00 #14
Hvad med:

var
    s : string;
  slist : TStringList;
  MFG,VER : string;
begin
    s:='MFG:Roland;CMD:RTL,RDGL3,PJL,DW_PCL;MDL:SP540V;CLASS:PRINTER;VER:6.00;STATUS:4008800050515253111100008500000000000171700;EXTRA_STATUS:000C800C800C800C8000000000085000000000;SN:ZS70137;SEH:0,1,1;';
    slist:=TStringList.Create;
  slist.NameValueSeparator:=':';
  ExtractStrings([';'],[],PChar(s),slist);

    MFG:=slist.Values['MFG'];
  VER:=slist.Values['VER'];
  //osv..

  Showmessage(MFG+'  '+VER);
end;
Avatar billede hrc Mester
21. januar 2007 - 00:30 #15
Nu håber jeg at NameValueSeparator findes i Delphi 7 (for det er da den version du kører, ikke?)

procedure TfrmMain.btnTest2Click(Sender: TObject);
var
  Index : integer;
  Fields : TStringList;
begin
  Fields := TStringList.Create;
  try
    Fields.Delimiter := ';';
    Fields.StrictDelimiter := true;
    Fields.NameValueSeparator := ':';
    Fields.DelimitedText := eInput.Text;

    Index := Fields.IndexOfName('Status');
    lbOutput.Items.Add(Fields. Names[Index]);
    lbOutput.Items.Add(Fields.ValueFromIndex[Index]); // Metode 1
    lbOutput.Items.Add(Fields.Values['Status']); // Metode 2
  finally
    Fields.Free;
  end;
end;
Avatar billede henge Nybegynder
31. januar 2007 - 15:16 #16
Kan jeg få noget hjæp til at værdierne efter extra_status op i 4.
det første 0 skal fjernes
Avatar billede hrc Mester
31. januar 2007 - 22:52 #17
Du har ikke programmeret ret meget har du? Der er i alt fald ikke meget kød på det ekstraspørgsmål.

Forudsat er at du bruger dkn's eksempel og har segmenterne klar:

// Hvis du vil fjerne alle foranstillede nuller:

while (aSegment <> '') and (aSegment[1] = '0') do
  System.Delete(aSegment,1,1);
  // Alternativ, men sikkert tungere: aSegment := copy(aSegment,2,MaxInt);

// Hvis du kun vil fjerne det første og kun hvis det er et nul.

if (aSegment <> '') and (aSegment[1] = '0' then
  aSegment := System.Delete(aSegment,1,1);
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