I think I got this stuff from wotsit.org... The header & record size are
stored as binary fields in pos 9-10 & 11-12 of the file header. Here is
some D3 code that I use to read dbf files: (you still need to already
know the record layout re: fields, etc, although I'm sure that
information is encoded in the header as well; this code just figures out
where the header ends so you can start parsing the data.)

----------------------- begin basic-------------------
*  [42] Sometimes headers are one char smaller than expected,
*         which shifts entire file.  To watch for this, check
*         the first record's RC code -- if that doesn't start
*         with an "R", then we're shifted, so subtract one
*         from the header size.

block.size = 10000
execute "cd /path/to/files"
execute "!exec ls *dbf" capturing dbf.files

max = dcount(dbf.files,@am)
for n = 1 to max
  dbf.file = dbf.files<n>
  print
  print "now processing ":dbf.file:"..."
  fv = %open(dbf.file,o$rdonly)
  char new.block[block.size]

  first.time = 1
  done = 0
  loop until done do

    r = %read(fv,new.block,block.size)

    if r lt block.size then
      done = 1
      new.block = new.block[1,r]
    end

    if first.time then
      * header.size & rec.size can be determined by reading the
      *  header data, but make sure that block size is greater
      *  than the header size.
      h1 = seq(new.block[9,1])
      h2 = seq(new.block[10,1])
      header.size = (256*h2)+h1 + 2
      r1 = seq(new.block[11,1])
      r2 = seq(new.block[12,1])
      rec.size = (256*r2)+r1

      ** [42]
      rc.index = header.size + 100
      rc.char  = new.block[rc.index,1]
      if rc.char ne "R" then
        header.size = header.size - 1
      end

      first.time = 0
      block = new.block[header.size,999999]
    end else
      block = block:new.block
    end

    loop
    while len(block) ge rec.size do
      rec = block[1,rec.size]
      block = block[rec.size+1,999999]
      gosub 1000  ;* parse the rec
    repeat

  repeat

  * last one may be partial record
  ach.rec = block
  gosub 1000

  x = %close(fv)

next n
-------------------------- end basic -----------------------------

I have also seen a freeware DOS program that convert dbase files to csv
(google for convert file?), but you have to have a DOS environment
available to shell out to...

Good Luck,

Scott Ballinger
Pareto Corporation
Edmonds WA USA
425-670-0831

-----Original Message-----
From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]
On Behalf Of Richard A. Wilson
Sent: Wednesday, April 07, 2004 3:35 PM
To: U2 Users Discussion List
Subject: Re: Extracting data directly from dbf files...


I'm fairly certain that the cedarville download utility handles dbf 
files. Since it comes with source code perhaps you can change the write 
logic to read

Rich

Lee Messenger wrote:

> Has anyone developed any processes to natively read '.dbf' type files 
> from within Universe basic?
> 
> I know we could use ODBC or UniObjects but prefer a more direct 
> approach.
--
u2-users mailing list
[EMAIL PROTECTED]
http://www.oliver.com/mailman/listinfo/u2-users

Reply via email to