"""
############################################
extract palm memos from a .pdb database 
file, to simple text files, one per memo,
using filenames derived from part of the
first line of memo; run in .pdb file's dir;
memo files appear in ./dbname/00n-line1.txt,
example: ./MemoDB/255-hardware_notes_4.txt;
dbase fmt = hdr + rec info array + memos0円;
############################################
"""
import glob # glob not in /usr
import struct, os
#flist = glob.glob('*.pdb') # skip others for now
flist = ['MemoDB.pdb'] # addresses beamed over
for fname in flist:
 file = open(fname, 'rb') # open in binary mode
 bytes = file.read()
 print fname, len(bytes)
 # dbname in hdr
 eos = bytes.find(chr(0)) # null term, upto 32 chars
 dbname = bytes[:min(32,eos)]
 print dbname
 if not os.path.exists(dbname):
 os.mkdir(dbname)
 else:
 os.system('rm %s/*' % dbname) # make or clear output dir
 # number records in hdr
 frec = 77
 (nrec,) = struct.unpack('>H',bytes[frec-1:frec+1]) # short, big-endian
 print nrec
 # scan rec info array after hdr
 flst = 70
 for rec in range(1, nrec+1):
 # rec start offset
 floc = flst + (rec * 8)
 (rloc,) = struct.unpack('>I', bytes[floc:floc+4]) # int, or just << bytes # rec end offset fend = flst + ((rec+1) * 8) (rend,) = struct.unpack('>I', bytes[fend:fend+4])
 print rec, floc, rloc, rend
 try: # memos past info array
 memo = bytes[rloc:rend] # entire memo text
 if memo[-1] == '\x00': memo = memo[:-1] # drop null at end
 # makeup file name from 1st line
 eolnpos = memo.find('\n')
 if eolnpos == -1: eolnpos = len(memo) # -1 if no eoln
 linelen = min(40, eolnpos) # up to 40 chars
 line0 = memo[:linelen]
 if line0[-1] == '\r': line0 = line0[:-1] # drop dos crg ret?
 line1 = ''
 for c in line0: # strip invalid chars
 if (not c.isalnum()) and (c not in ['-']): # allow dash, not colon
 line1 += '_'
 else:
 line1 += c
 print repr(line1)
 
 # output in text mode for eolns
 xname = '%s/%03d-%s.txt' % (dbname, rec, line1)
 xtract = open(xname, 'w')
 xtract.write(memo) 
 xtract.close()
 except:
 import sys
 print sys.exc_type, sys.exc_value
 print 'BAD'
print 'Done'

AltStyle によって変換されたページ (->オリジナル) /