[Delphi] Inlezen textfile met tabs

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

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Ik heb al gezocht met de search, en in de help van Delphi, maar ik kan niks vinden waar ik iets aan heb.

Ik heb een textfile met daarin op elke regel meerdere gegevens, gescheiden door een tab.
Ik wil nu elke regel woord/getal voor woord/getal inlezen en de gegevens opslaan in een array met records.

Hoe lees ik zo'n tekstfile woord voor woord in? Ik kan nu alleen regel per regel, maar dat wil ik niet.

  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Je zal het toch echt per regel moeten inlezen en dan zelf elke regel opsplitsen.

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


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
LordLarry schreef op 06 May 2003 @ 16:30:
Je zal het toch echt per regel moeten inlezen en dan zelf elke regel opsplitsen.
Je kunt het bestand niet tab voor tab doorlopen en dan elke keer de string die ie dan tegenkomt inlezen?

Het is trouwens een Excel-File die ik opsla als txt file die ik inlees, en dan wil ik dus alle kolommen inlezen. Is het dan niet mogelijk om de excelfile heel makkelijk te benaderen en dat ik de cel die ik wil inlezen gewoon kan benaderen met [x,y]?

[ Voor 31% gewijzigd door Oscar Mopperkont op 06-05-2003 16:34 ]


  • Osiris
  • Registratie: Januari 2000
  • Niet online
Ik zou eens zeggen, kijk ook eens op http://www.torry.net/quic...xcel&Exact=&Title=Yes&s=0 :)

Misschien staan daar wel leuke Components voor Excel etc, lijkt me wat handiger dan kloten met txt-bestandjes :)

Verwijderd

Als je de excel file als .csv exporteert kun je iets dergelijks doen als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var 
  params : TStringlist;
  regel : string;
  index:integer;
begin
  params:=TStringlist.Create;
  // open tekst bestand  
  while not bestand.eof
  begin

    regel:=bestand.readstring;
    params.Clear;
    params.CommaText:=regel;
    for index:=0 to params.count-1 do
        //  doe iets met params[index]
  end;
  // sluit tekst bestand
  params.free;
end;

Verwijderd

Als je toch een excel bestand gebruikt dan is het volgende heel handig.

- Zet in de eerste regel van je bestand de collom namen neer.
- Zet nu een lege regel neer.
- Hierna komt al je data.

Exporteer dit bestand als dbf. En maak een database koppeling naar je dbf bestand en je kan alles perfect uitlezen.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Verwijderd schreef op 06 May 2003 @ 23:41:
Als je toch een excel bestand gebruikt dan is het volgende heel handig.

- Zet in de eerste regel van je bestand de collom namen neer.
- Zet nu een lege regel neer.
- Hierna komt al je data.

Exporteer dit bestand als dbf. En maak een database koppeling naar je dbf bestand en je kan alles perfect uitlezen.
Dat exporteren als dbf lukt nog wel, maar dat tweede.... :? Ik ben pas een paar dagen bezig met Delphi, dus dat zal ik moeten uitzoeken. Of kun je wat meer hints geven?

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

TAB of comma separated values inlezen van een bestand komt in de practijk echt vaak voor. Ik doe het altijd als volgt. Maak een record structure waarin je de gegevens gaat opslaan die in 1 zo'n tekst-regel staan. En maak een functie die een string (1 regel) converteerd naar zo'n record structure. Dus zoiets:

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
const
  c_Separator = #9; {tab}

type
  TMyRecord = record
    Naam : String;
    Adres : String;
    Woonplaats : String;
  end; {record}

function OmzettenRegel(strRegel : String) : TMyRecord;
{ zet tab separated values om in een record structure }
var
  strField : String;
  tmpRecord : TMyRecord;
  Field, i : Integer;
begin
  Field := 0;

  { zoek naar 1ste tab in regel }
  i := Pos(c_Separator, strLine);

  { doorloop gehele regel }
  while (i <> 0) do
  begin
    { haal veld uit regel }
    strField := Trim(Copy(strLine, 1, i-1));

    { verwijder veld van regel }
    Delete(strLine, 1, i);
    strLine := Trim(strLine);

    { stop veld in bijbehorende veld van record }
    Case Field Of
      {Naam : String}
      00 : tmpRecord.Naam := strField;
      {Adres : String}
      01 : tmpRecord.Adres := strField;
      {Woonplaats : String}
      02 : tmpRecord.Woonplaats := strField;
    end; {case}

    { volgende veld }
    Field := Field + 1;

    { zoek volgende seperator-character in input regel }
    i := Pos(c_Separator, strLine);
  end; {while}

  { function result }
  OmzettenRegel := tmpRecord;
end;

vervolgens kan je makkelijk in een loopje het bestand regel voor regel inlezen, en elke regel mbv die functie omzetten naar je record structure :7 dus zoiets

Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
procedure InlezenBestand;
var
  F : TextFile;
  strLeesRegel : String;
  i : Integer;
  tmpMyRecord : TMyRecord;
begin
  { input bestand voorbereiden }
  FileMode := 0; {readonly}
  AssignFile(F, 'inputbestand.txt');
  Reset(F);

  { regel voor regel inlezen en array vullen }
  i := 0;
  repeat
    ReadLn(F, strLeesRegel);
    tmpMyRecord := OmzettenRegel(strLeesRegel);

    { stop nu de record in een array of whatever }
    i := i + 1;
    GlobalArrayOfMyRecords[i] := tmpMyRecord;

  until EOF(F);

  Close(F);

end;

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Verwijderd schreef op 06 May 2003 @ 17:08:
Als je de excel file als .csv exporteert kun je iets dergelijks doen als dit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
var 
  params : TStringlist;
  regel : string;
  index:integer;
begin
  params:=TStringlist.Create;
  // open tekst bestand  
  while not bestand.eof
  begin

    regel:=bestand.readstring;
    params.Clear;
    params.CommaText:=regel;
    for index:=0 to params.count-1 do
        //  doe iets met params[index]
  end;
  // sluit tekst bestand
  params.free;
end;
Dan moet je hem wel als *.prn file exporteren en dan werkt het wel. Commatext werkt namelijk alleen met komma's en spaties.
Het werkt bij mij nu.

Maar in bovenstaande reply zag ik ook een wat gebruiksvriendelijkere oplossing. Want nu moet de gebruiker het bestand opslaan als *.prn en vervolgens hernoemen naar *.txt (anders werkt het niet bij mij)

Verwijderd

Om alle tabs in een regel in een komma te veranderen kun je de volgende functie gebruiken
regel:=StringReplace(regel,#9,',',rfReplaceAll)
gebruiken, daarna is de regel geschikt voor CommaText van TStringlist

  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-08 10:56

Delphi32

Heading for the gates of Eden

Delphi 6 laat je zelf opgeven welke delimiter er gebruikt wordt, dat is nog eenvoudiger:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  try
    sl.Delimiter := ','; //of elk ander karakter
    sl.DelimitedText := mijnlangestring;
    ShowMessage(IntToStr(sl.Count));
  finally
    sl.Free;
  end;

Verwijderd

Om het dbf bestand te benaderen heb je database componenten nodig ik weet niet welke versie je van delphi hebt want deze zitten niet in de standaard versie.

- Maak via de BDE Administrator een Connectie naar het DBF bestand.
- Laat je db component naar de BDE connectie wijzen.

Nu kun je via de db componenten het bestand benaderen.

Ik zal is kijken of ik nog een test projectje heb liggen.

  • Oscar Mopperkont
  • Registratie: Februari 2001
  • Laatst online: 03-08-2024
Verwijderd schreef op 07 May 2003 @ 17:56:
Om het dbf bestand te benaderen heb je database componenten nodig ik weet niet welke versie je van delphi hebt want deze zitten niet in de standaard versie.

- Maak via de BDE Administrator een Connectie naar het DBF bestand.
- Laat je db component naar de BDE connectie wijzen.

Nu kun je via de db componenten het bestand benaderen.

Ik zal is kijken of ik nog een test projectje heb liggen.
Voor mij hoefje het niet epr se te plaatsen hoor, ik gebruik de oplossing van Delphi32 en die werkt perfect.

Maar het kan nooit kwaad om het te plaatsen, misschien dat ik in de toekomst ooit nog eens wat met databases ga doen.
Pagina: 1