parsanje CSV datoteke

Odpiranje, tiskanje, pisanje v datoteke in drugo.
Odgovori
peterv
Prispevkov: 987
Pridružen: 29.03.2002 13:24:32

parsanje CSV datoteke

Odgovor Napisal/-a peterv » 06.03.2006 08:25:19

Uporabljam Delphi 7 in me zanima če ima morda kakšno knjižnico za parsanje CSV datotek.. ločilo med podatki je podpičje...


lp
Peter

peterv
Prispevkov: 987
Pridružen: 29.03.2002 13:24:32

parsanje CSV datoteke

Odgovor Napisal/-a peterv » 06.03.2006 08:42:45

Aha.. .našel sem

Koda: Izberi vse

 var
  cars : TStringList;            // Define our string list variable
  i    : Integer;
begin
  // Define a string list object, and point our variable at it
  cars := TStringList.Create;

  // Now add some cars to our list - using the DelimitedText property
  // with overriden control variables
  cars.Delimiter := ' ';        // Each list item will be blank separated
  cars.QuoteChar := '|';        // And each item will be quoted with |'s
  cars.DelimitedText := '|Honda Jazz| |Ford Mondeo| |Jaguar "E-type"|';

  // Now display these cars
  for i := 0 to cars.Count-1 do
    ShowMessage(cars[i]);       // cars[i] equates to cars.Strings[i]
end;
  
ampak kot vidim moram podat tudi QuoteChar.. v mojem primeru pa nimam QuoteChar.. in mi parser sparsa to kar bi moalo biti v eni vrstici v več vrstic..
primer mojih podatkov:

;zap.št.;Poslovna ENOTA;Dat. Prijave v zav.;PRIIMEK in IME kreditojemalca;ULICA;Kraj;EMŠO;Davčna št.;Podjetje;Ulica podjetja;Kraj podjetja;Št. Kreditne partije;Glavnica kredita;Datum odobritve kredita;Datum zapadlosti prvega obroka;Datum zapadlosti zadnjega obroka;Trajanje kredita;Realna OM v %;

Torej tam kjer je presledek v tekstu recimo ;Poslovna ENOTA; mi parser sparsa v dva stringa.. prvi je Poslovna in drugi ENOTA...

Je kakšen način, da to dobim kot en string?

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

parsanje CSV datoteke

Odgovor Napisal/-a Runner » 06.03.2006 10:08:37

Imaš dve možnosti.

1. Uporabi StrictDelimiter property od TStringList. V Delphi 2006 obstaja v D7 pa mislim da ne. Za 2005 pa ne vem.

Determines how the Delimiter property is used.
Class
TStrings

Syntax


[Delphi] property StrictDelimiter: Boolean read GetStrictDelimiter write SetStrictDelimiter;


Description
Use this property to specify whether the Delimiter is the only value used within the DelimitedText property. If set to True, individual strings in DelimitedText are separated only by the character that is the value of Delimiter. If set to False, individual strings in DelimitedText can be separated by a space, a non-printable character, or the character that is the value of Delimiter.

2. Uporabi svoje parsanje

Primer kode ki jo uporabljam sam:

Koda: Izberi vse

//******************************************************************************************
// Get Next Token
//******************************************************************************************

function GetNextToken(Const S: string; Separator: char; var StartPos: integer): String;
var
   Index: integer;
begin
   Result := '';

{Step over repeated separators}
{Step over repeated separators}
//   While (S[StartPos] = Separator)
//   and (StartPos <= length(S))do
//    StartPos := StartPos + 1;

   if StartPos > length(S) then Exit;

  {Set Index to StartPos}
   Index := StartPos;

  {Find the next Separator}
   While Index <= length(S) do
   begin
     if S[Index] <> Separator
     then
       Index := Index + 1
     else
       Break;
   end;

{Copy the token to the Result}
   Result := Copy(S, StartPos, Index - StartPos) ;

{SetStartPos to next Character after the Separator}
   StartPos := Index + 1;
end;

//******************************************************************************************
// String Token split fuktion
//******************************************************************************************

procedure Split(const S: String; Separator: Char; MyStringList: TStringList) ;
var
   Start: integer;
begin
   Start := 1;
   While Start <= Length(S) do
     MyStringList.Add(GetNextToken(S, Separator, Start)) ;
end;
Ta koda pa deluje v vseh verzijah D7, 2005, 2006...
Zadnjič spremenil Runner, dne 06.03.2006 10:09:00, skupaj popravljeno 1 krat.

Uporabniški avatar
Lee_Nover
Prispevkov: 3653
Pridružen: 20.05.2001 14:31:55

parsanje CSV datoteke

Odgovor Napisal/-a Lee_Nover » 06.03.2006 12:46:42

StrictDelimiter!! koncno!! :)
.. my 2 c ..
- I hate noobs -

Uporabniški avatar
Runner
Prispevkov: 1079
Pridružen: 03.02.2005 12:05:25

parsanje CSV datoteke

Odgovor Napisal/-a Runner » 06.03.2006 13:01:08

Ja res, parsanje je bilo brez tega propertya praktično neuporabno. So se le zmigali. :)

Odgovori