巧用SUBSTR()和REPLACE恢复库内错位数据

Author: 武汉 蔡致 Date: 1992-07-31

        用DBASEⅢ建立的数据库,数据内容按记录、字段的先后顺序依次陆续存放,各字段之间无分隔符,两记录之间,有一空格作为分隔符。因此,使错位记录有一定的规律性,即从错位记录开始到各错位记录均在同一字段、同一字符处出现错位的内容。在恢复时,首先消除错位记录开始部分所存在的隐含字符,其次,将错位记录按字段所需长度,用SUBSTR函数依次取出,当涉及到第2条错位记录时,应将指针定位到第2条记录上,并继续用SUBSTR取出,使之能够还原,然后,用REPLACE命令进行替换,并使之循环运行,即可恢复库内所有错位数据。
        程序清单;
        @O,O CLEAR
        USE opsysdbf
        STORE“” TO ziduan1,ziduan
        gg=949
        DO WHILE gg<954
        @10,10 SAY“NO:”
        ??  gg
        GO gg
        namel=SUBSTR (字段n,25,24)
        name2=SUBSTR(字段n,49,60)
        nameN=SUBSTR(字段n,8,21)+字段n
        nameNN=SUBSTR(字段n,1,24)
        gg=gg+1
        ziduanl=字段1:……ziduan=字段N
        go gg
        REPLACE 字段1 WITH namel, 字段2:WITH name2……
        REPLACE 字段N WITH nameN,字段N WITH nameNN
        REPLACE:字段N  WITH ziduan1,字段N WITH ziduan
        STORE “” TO ziduan1,ziduan
        gg=gg+1
        ENDDO
        CLOSE DATABASES
        RETURN
        注意:1) 如果企图用REPLACE命令填充一个记录的数据时,首先应将该记录置空,否则无法使数据填入; 2)在用SUBSTR函数取子字符串时,字符串的起始位置和长度一定要计算准确,否则会出现新的错位记录;3)循环时请将最后一错位记录保留,否则会将正常记录也置空。