Avatar billede thanders Nybegynder
06. marts 2004 - 16:31 Der er 10 kommentarer og
1 løsning

Dele opp en streng

Hei,
Finnes det noen funksjon i Delphi som lar meg dele opp en streng ved spesifisert char og legge delene i en array?
I web script språket PHP er det noe som heter explode() som lar meg gjøre det.

eg.
foo = explode(" ","Hallo verden !");
//foo[0] = Hallo, foo[1] = verden, foo[2] = !

på forhånd takk,
Thomas A.
Avatar billede doc404 Novice
06. marts 2004 - 16:48 #1
Desværre..I det mindste ikke i v5.

Men du kan bruge denne:

type
  TStringArray = array of string;

function SplitString(const Str,Sep : string; var Arr : TStringArray) : integer;
var
  p,q : PChar;
  i  : integer;
begin
  i := 0;
  SetLength(Arr,i);
  p := PChar(Str);
  while p^ <> #00 do
  begin
    SetLength(Arr,i+1);
    q := AnsiStrPos(p,PChar(Sep));
    if q <> nil then
      begin
        SetString(Arr[i],p,q-p);
        Arr[i] := Trim(Arr[i]);
        p := q + 1;
        if p^ = #00 then
          begin
            SetLength(Arr,i+2);
            Break;
          end;
      end
    else
      begin
        Arr[i] := p;
        Arr[i] := Trim(Arr[i]);
        Break;
      end;
    Inc(i);
  end;
  Result := Length(Arr);
end;
Avatar billede hrc Mester
06. marts 2004 - 19:02 #2
Hvad sker der så når strengen ser sådan her ud:

  st := '"Hello, world!",22,"Magnus og Myggen"';

Vil kommaet i "Hello, World!" ikke lave rod i det? Jeg sad tidligere og bryggede nedenstående kodestump sammen:

const
  FieldDelimiter : char = ',';
  StringDelimiter : char = '"';

procedure Explode(aSt : string; aStringList : TStringList);
var
  i : integer;
  bString, bField : boolean;
begin
  aStringList.BeginUpdate;
  try
    aStringList.Clear;
    repeat
      i := 1; bString := false; bField := false;
      while (i < length(aSt)) and not bField do begin

        if aSt[i] = StringDelimiter then
          bString := not bString;

        if not bString then
          bField := aSt[i] = FieldDelimiter;

        if bField then begin
          aStringList.Add(copy(aSt,1,i-1));
          delete(aSt,1,i);
        end; // if
        inc(i);
      end; // while
    until i = length(aSt);
    aStringList.Add(aSt); // Add last
  finally
    aStringList.EndUpdate;
  end; // try
end;
Avatar billede hrc Mester
06. marts 2004 - 19:08 #3
Bemærk, at den deler strengen op på følgende måde:

aStringList[0] = '"Hello, world!"'
aStringList[0] = '22'
aStringList[0] = '"Magnus og Myggen"'

På den måde kan man se om 22 er et tal eller tegnene '2' og '2'

Kom lige til at tænke på hvad der sker hvis man sender proceduren følgende:

st := '"Jens sagde ''Hello, world!''"' - det vil vist ikke gå godt, men mon ikke det er udenfor hvad CSV-formatet specificerer (sikkert ikke, æv).
Avatar billede doc404 Novice
06. marts 2004 - 20:00 #4
Du har ganske ret. Min funktion tager ikke højde for "strenge i strenge"
Avatar billede hrc Mester
09. marts 2004 - 23:45 #5
En helt anden løsning er i øvrigt at lave en sch-fil (schema):

MyData.sch:
[MYDATA]
FILETYPE = VARYING
CHARSET = ascii
DELIMITER = "
SEPARATOR = ,
Field1 = ID,LONGINT,04,00,00
Field2 = Navn,CHAR,16,00,00

MyData.Txt:
1,"Foigt, Pelle"
2,"Pind, Søren"

Dernæst laver du et BDE-alias til filerne, eksempelvis MyDataAlias

I din Delphi-form placerer du en TTable og sætter properties:
DatabaseName = MyDataAlias
TableName = MyData.txt
TableType = ttASCII

Nu kan du åbne "tabellen" og arbejde på den som om det var en Access eller Interbase tabel. Dvs. der er en undtagelse og det er at det er en sekventiel gennemløb af filen. Du kan vist ikke rykke tilbage, kun frem - men det er normalt også det man plejer:

while not Table1.Eof do begin
  ..
  Table1.Next;
end;

Eksemplet er beskrevet i de sene kapitler i "Delphi Developers Guide", så hvis du kan finde et eksemplar, er det hele beskrevet der. I "D5 Developers guide" skal du kigge i kapitel 28, side 1202+ (for god information kan du læse de foregående først ;-))
Avatar billede doc404 Novice
09. marts 2004 - 23:54 #6
Også er der i Delphi 7 (6?) denne herlige function. Har lige opgraderet til 7'ern...

function ExtractStrings(Separators, WhiteSpace: TSysCharSet; Content: PChar; Strings: TStrings): Integer;

hrc>du er godt nok grundig! Du skal have en meget stor ros herfra - dine kommentare og svar er gennemtænkte.
Avatar billede hrc Mester
10. marts 2004 - 00:46 #7
doc404 - tak for rosen (du har åbenbart ikke læst alle mine svar ;-)).

Når nu man er programmør med "rigtig god tid" og med forkærlighed for Delphi, så er svarene kun præget af den stress der kommer ved at forsøge poste dem før top-500 hajer som Borrisholdt, arnev og dig (andre ikke nævnt, men ikke glemt) - men det kan nu også være svært nok.


Synes nok der var en eller anden ExtractStrings-funktion og det er vel den som thanders leder efter. Hvis man har VCL-filerne er det i øvrigt en sød hardcore rutine at studere.


En anden god løsning som jeg fandt på eksperten for et par uger siden, men første tænkte på nu: aStringList.CommaText (bruger en funktionen AnsiExtractQuotedStr til at lave det om til et array af nul-terminerede strengsekvenser). Jeg antager at man bare fodrer den med strengen og så bliver den parset.


Har en D8'er liggende, men den ligner Visual Studio .Net så meget at der er en lille mental blokade mod at gå igang med den. Det er jo faktisk også et farvel til førnævnte VCL-filer - men det nok fremtiden for Delphi.
Avatar billede erikjacobsen Ekspert
10. marts 2004 - 00:53 #8
Uden at have checket i detaljer vil jeg mene at
  http://www.latiumsoftware.com/en/articles/00009.php
vil kunne klare det.
Avatar billede doc404 Novice
10. marts 2004 - 01:09 #9
hrc> D8 er vist så vidt jeg har forstået ren .NET, så verdens bedste win32 værktøj hænger vist foreløbig i v7. Har netop opgraderet en v5 til v8, og der fulgte gudskelov en 7'er med.

Og så er det jo altid med programmeringssprog - det tager ca. 1 dag at lære grundreglerne og resten af livet at lære bibliotekerne at kende ;-)
Avatar billede thanders Nybegynder
10. marts 2004 - 18:02 #10
Takk doc404,
ExtractStrings ser ut som hva jeg lette etter,
og hrc, du kom i forkjøpet med din sch løsning, det var mitt neste spørsmål ;-)
Har dere noen bøker å anbefale en nybegynner? Jeg ønsker å lære meg å lage vindu applikasjoner.
Og hva tror dere om strategien om å velge Delphi fremfor C++ eller C# (Visual) til dette formålet?
Avatar billede hrc Mester
12. marts 2004 - 16:10 #11
Hvis engelsk ikke er et problem, så er der to gode bøger jeg kan anbefale: Delphi Developers Guide af Teixeira og Pacheco eller Mastering Delphi 7 af Marco Cantu. De er ret ens, men den sidste (som jeg har læst mindst) er vist den der har fornyet sig mest op gennem Delphi-versionerne. Begge bøger er gode men jeg tror ikke du behøver begge. Der er masser af pædagogiske eksempler i begge.

Der er gode sider på Internettet: http://www.delphi.about.com eller http://www.torry.net. Her er masser af information og undervisning at hente.

Hvilket programmeringssprog skal man vælge? Spørger du en Delphi programmør, så er der ingen tvivl om at det er verdens bedste udviklingsværktøj (se bare doc404 og mig). Delphi er populært, men trængt af Visual Basic og C++. Tror amerikanerne har haft noget imod, at Pascal er et europæisk udviklet sprog.

Jeg er dog ikke i tvivl om, at starter man med Delphi/pascal, så bliver man en bedre programmør. Den strukturerede opbygning og fine udviklingsmiljø opdrager den vordende udvikler meget bedre end eksempelvis C++ hvor megen, megen grim kode er blevet lavet.

Derfor: Start du bare med Delphi og lad interessen lede dig. Det kan godt være at du ender i C# eller C++, men så har du i det mindste lært at programmere først!
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