既然你有可变长度的数据块,就可以读取它们只能按顺序,所以为了读出第n个块,则需要阅读所有n个第一块:
function readDataBlock($f) {
$data = unpack('nmember_id', fread ($f, 2)); // I assume member_id is n, not s
if ($data['member_id'] == 0xFFFF) {
throw new \Exception('End of file');
}
$data = array_merge($data, unpack('Cmember_name_length', fread ($f, 1))); //again, it must be C, not c, as I can't imagine negative length.
$data = array_merge($data, unpack('a*member_name', fread ($f, $data['member_name_length']))); // be sure you understand how a differs from A
return array_merge($data, unpack('C100other_data', fread ($f, 100))); // are you sure C100 is what you want here?
}
function get_data($file, $number)
{
if(!$fp = fopen ($file, 'rb')) return 0;
fread ($fp, 100); //skip header
for($n = 0; $n <= $number; $n++) {
$data = readDataBlock($fp); // read single member
}
fclose($fp);
return $data; //return the n-th member
}
如果文件是足够小,以适应内存,它可能会更好地阅读一次,并从内存返回第n个成员:
$data = [];
while(true) {
try {
$data[] = readDataBlock($fp);
} catch(\Exception $e) {
break;
}
}
function get_data(&$data, $number)
{
return $data[$number];
}
PHP是不是很擅长这种事情。如果可能,我建议切换到基于文本的格式,如JSON或XML甚至CSV – GordonM
谢谢。随你。我只想要一个可以导入到mysql的数据。 :)如果你有办法做到这一点,赞赏。我没有太多的exp在编程... – Diamond
如果数据来自MySQL然后MySQL文本转储似乎是明显的解决方案! – GordonM