note 104956 added to book.dbase

From: Date: Mon, 18 Jul 2011 23:43:41 +0000
Subject: note 104956 added to book.dbase
Groups: php.notes 
Request: Send a blank email to php-notes+get-181677@lists.php.net to get a copy of this message
Thank you, Erich; that code was very helpful. I also needed to know whether a record had been marked for deletion. This is indicated with an asterisk ("*") in the first byte of the record; the data actually starts with the second byte of each record. See http://www.dbase.com/KnowledgeBase/int/db7_file_fmt.htm (I suspect that your code may accidentally include the 0x1A that marks the end-of-file in the last field of the last record.) My database had some binary data in it, so I went with serialize() instead of json, but here's an updated version that considers that marker: <?php function echo_dbf($dbfname) { $fdbf = fopen($dbfname,'r'); $fields = array(); $buf = fread($fdbf,32); $header=unpack( "VRecordCount/vFirstRecord/vRecordLength", substr($buf,4,8)); echo 'Header: '.serialize($header).PHP_EOL; $goon = true; $unpackString=''; while ($goon && !feof($fdbf)) { // read fields: $buf = fread($fdbf,32); if (substr($buf,0,1)==chr(13)) {$goon=false;} // end of field list else { $field=unpack( "a11fieldname/A1fieldtype/Voffset/Cfieldlen/Cfielddec", substr($buf,0,18)); echo 'Field: '.serialize($field).PHP_EOL; $unpackString.="A$field[fieldlen]$field[fieldname]/"; array_push($fields, $field);}} fseek($fdbf, $header['FirstRecord']); // move back to the start of the first record (after the field definitions) for ($i=1; $i<=$header['RecordCount']; $i++) { $deleted=fread($fdbf, 1); $buf = fread($fdbf,$header['RecordLength']-1); switch($deleted) { case ' '://valid record $record=unpack($unpackString,$buf); echo "record $i: ".serialize($record).PHP_EOL; break; case '*'://deleted record echo "Skipping deleted record $i".PHP_EOL; continue; break; default: printf("Unrecognized record marker %s, dec %d".PHP_EOL, $deleted, ord($deleted)); } //echo $i.$buf.PHP_EOL;//raw record } fclose($fdbf); } ?> ---- Server IP: 64.71.164.2 Probable Submitter: 70.181.20.154 ---- Manual Page -- http://www.php.net/manual/en/book.dbase.php Edit -- https://master.php.net/note/edit/104956 Del: integrated -- https://master.php.net/note/delete/104956/integrated Del: useless -- https://master.php.net/note/delete/104956/useless Del: bad code -- https://master.php.net/note/delete/104956/bad+code Del: spam -- https://master.php.net/note/delete/104956/spam Del: non-english -- https://master.php.net/note/delete/104956/non-english Del: in docs -- https://master.php.net/note/delete/104956/in+docs Del: other reasons-- https://master.php.net/note/delete/104956 Reject -- https://master.php.net/note/reject/104956 Search -- https://master.php.net/manage/user-notes.php

« previous php.notes (#181677) next »