Results 1 to 5 of 5

Thread: Tbufdataset (=Delphi Clientdataset) met variabele veldgroottes?

  1. #1

    Tbufdataset (=Delphi Clientdataset) met variabele veldgroottes?

    Allen,

    Ben bezig om (ASCII, in toekomst wellicht ook UTF8) text output (van een script) met een formaat als dit:
    --TestID:
    ScriptVersion
    --TestDescription:
    Informational: version of database script
    --Explanation:
    Shows the version of the script that generated these results
    --Norm:
    None
    --Results:
    20110316
    --RecordEnd
    om te zetten in CSV, liefst ook tab & ; separated files en als het kan ook XML; bijv:
    TestID,TestDescription,Explanation,Norm,Results
    ScriptVersion,Informational: version of database script,Shows the version of the script that generated these results,None,20110316
    Een voorbeeld van de te lezen file:
    https://bitbucket.org/reiniero/db2se.../db2secout.txt

    Hiervoor gebruik ik een TBufDataset, waaraan een dbgrid hangt.
    Zie de scriptdumpreader unit op https://bitbucket.org/reiniero/db2se...dumpreader.pas

    Ik zit nu vast bij het inleesgedeelte.

    Vragen:
    Ik weet vantevoren niet hoe groot de velden zijn en ik gebruik ftString als veldtype. Dan moet ik een veldlengte definieren.
    1. Als ik iets enorm groots als 32768 definieer, krijg ik een SIGSEGV bij het vullen van de velden. Ik gebruik dit soort code:
    Code:
    ResultDataSet.FieldByName(CurrentField).AsString := TextLine;)
    Doe ik iets verkeerds of komt het gewoon omdat mijn RAM vol is? (En zo ja, waarom swapt Windows dan niet naar de pagefile)
    2. Het lijkt erop dat er geen compressie oid wordt gebruikt voor de stringvelden, dus ik krijg bijv 5 karakters tekst met 32763 spaties. Er is zeker geen handige manier om VARCHAR-achtige velden/gecomprimeerde velden te maken?
    3. Als gevolg van 2 toont mijn grid ook allerlei spaties achter de tekst in de velden. Is daar een oplossing voor?
    4. Tenslotte: is het misschien een heel dom idee om die bufdataset te gebruiken (de te lezen file kan nogal groot worden) en is er een makkelijker manier?

    Bedankt,
    BigChimp

  2. #2
    Silly member NGLN's Avatar
    Join Date
    Aug 2004
    Location
    Werkendam
    Posts
    5,133
    Om even met jouw laatste vraag te beginnen: als het slechts de bedoeling van het programma is om tekst om te zetten naar andere formaten; ja, dan zou ik hier geen dataset voor gebruiken, maar een simpele parser schrijven.

    Betreffende die veldgrootte: je kunt het met ftMemo proberen, die is sowieso geschikt strings van onbekende lengte, maar volgens mij moet het met Size = 0 ook lukken bij ftString.
    (Sender as TNLDUser).Signature := 'Groeten van Albert';

  3. #3
    John Kuiper
    Join Date
    Apr 2007
    Location
    Almere
    Posts
    8,747
    Dit gaat zowiezo niet in een dataset passen. Het voorbeeld, die je meegeeft als website, geeft als results meerdere antwoorden, waardoor je recordstructuur variabel wordt.
    XML zal nog kunnen, omdat deze structuur meerdere subtags aankan in een bovenliggende tag.

    1. Om altijd tekst te kunnen plaatsen, zal je gebruik kunnen maken van ftMemo.
    2. Wat NGLN al zegt, kan je beter een parser maken. Dan kan je ook je spaties achter de tekst verwijderen, waardoor je een 'schone' string krijgt.
    3. Zie optie 2
    4. Bufferen kan je in dit geval beter in een stream doen, tenzij je bestand een 1 gigabyte groot wordt.
    Delphi is great. Lazarus is more powerfull

  4. #4
    Bedankt voor de reacties.

    @jkuiper:
    Dit gaat zowiezo niet in een dataset passen. Het voorbeeld, die je meegeeft als website, geeft als results meerdere antwoorden, waardoor je recordstructuur variabel wordt.
    Inderdaad, de structuur is variabel. Ik doorloop de file 2x; de eerste keer bouw ik in runtime de velden op van de dataset; de 2e keer lees ik de data in. Dat werkt wel.

    @NGLN: heb ftString met size 0 geprobeerd; GUI grid gaf wel alle velden maar geen inhoud. Kan proberen om eerst de save-routine af te maken om te kijken wat er nou daadwerkelijk in de dataset zat.
    Ik ga het ook 's met ftMemo proberen, bedankt.

    En ik heb al een simpele parser geschreven om de velddefinities en data in die dataset te krijgen.

    Als het allemaal inderdaad niet werkt, bouw ik het programma om: nog steeds 1 pass: verzamelen veldnamen; 2e pass: lezen data. Bij lezen data kan ik record voor record naar een outputfile schrijven, zonder met die dataset aan de slag te hoeven.
    Als de output gereed is kan ik een csvdataset of whatever aanmaken en daaraan de GUI grid koppelen ter naslag... of ik laat die grid gewoon weg

    Maar goed, het verbaast me wel dat die bufdataset op zo'n brute wijze een access violation geeft als ik probeer te grote velden te maken...

  5. #5
    Mensen,

    Nogmaals dank voor de tips.
    Ik ben overgegaan op een dbf in de temp directory om de tijdelijke data in op te slaan.
    Vervolgens met het lazdbexport package simpel export naar csv, xml, dbf etc verzorgd. Dat scheelt een hoop werk!

    Het lukt me overigens niet om de dbf in het grid te krijgen maar dat zal wel iets heel stoms zijn en is ook geen kernfunctionaliteit.

    Source & executable zitten in mijn repository onder de map Outputparser, zie https://bitbucket.org/reiniero/db2securityscript/src

    Groeten,
    Chimp

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •