You can use Copy_records to start from a specific record number.
So, if you do a copy_records (a record at a time) and it fails on record 100, then you can ...

move 101 to file.recnum 
find eq file by recnum 
Copy_Records file newfile 0
to pick up again from record 101

In terms of the table file format, if you don't have any compression on the table, then the file format is relatively simple.
I have an example Ruby script that can read data out of a DF table. This has all the record and block length details hard coded though. Maybe you can do something with it.