标题:再次请教搜索无重复的行
只看楼主
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
结帖率:73.44%
已结贴  问题点数:20 回复次数:22 
再次请教搜索无重复的行
先生您好,我终于找到我的文字表述的死结了
这也平添了我与您交流的许多障碍,对不起了
我现在终于觉得我心中想表示的终于一吐为快了
文字表述是这样的(与前次最大的区别是:依次下移的行与不断变化的临时文件作比对)
请教.rar (13.3 KB)
  
再次修正思路说明.rar (3.95 KB)


逻辑要求再说明如下:总的要求是以每一行为标准与“原表”的312行都作一次比对,当某一行为标准下全表各行与临时文件作比对的过程中需建立一个临时文件以记录无重复数的行,并当全表312行都比对完后将临时文件写入“比较后”自动删除该临时文件;以此类推。
第一轮(整个运行过程相当于有312轮):
第一轮的第1步:以第一行为标准,建立临时文件并将作为标准的第一行记入临时文件,第一行与临时文件比对有重复(自比对有重复即回避,以下同)
第一轮的第2步:第二行与临时文件作比对,若无重复则第二行记入临时文件,此时临时文件中有20个数,若有重复则临时文件中只有第一行10个数;
第一轮的第3步:第三行与临时文件作比对,若无重复则第三行记入临时文件,若有重复则第三行不记入临时文件;
第一轮的第4步:第四行与临时文件作比对,若无重复则第四行记入临时文件,若有重复则第四行不记入临时文件;
……
第一轮的第312步:第312行与临时文件作比对,若无重复则第312行记入临时文件,若有重复则第312行不记入临时文件。
此时第一轮结束,并将第一轮比对下来的临时文件写入“比较后”并自行删除临时文件。
第二轮:
第二轮的第1步:以第二行为标准,建立临时文件并将作为标准的第二行记入临时文件,第一行与临时文件作比对,若无重复则第一行记入临时文件,此时临时文件中有20个数,若有重复则临时文件中只有第二行10个数;
第二轮的第2步:第二行与临时文件作比对,若无重复则第二行记入临时文件,若有重复则第二行不记入临时文件(此时实际为自比对必有重复故不记入);
第二轮的第3步:第三行与临时文件作比对,若无重复则第三行记入临时文件,若有重复则第三行不记入临时文件;
第二轮的第4步:第四行与临时文件作比对,若无重复则第四行记入临时文件,若有重复则第四行不记入临时文件;
……
第二轮的第312步:第312行与临时文件作比对,若无重复则第312行记入临时文件,若有重复则第312行不记入临时文件。
此时第二轮结束,并将第二轮比对下来的临时文件写入“比较后”并自行删除临时文件。
……
第三佰十二轮:
第312轮的第1步:以第312行为标准,建立临时文件并将作为标准的第312行记入临时文件,第一行与临时文件作比对,若无重复则第一行记入临时文件,此时临时文件中有20个数,若有重复则临时文件中只有第312行10个数;。。。。直至与312比对,至此运行结束。
搜索更多相关主题的帖子: 重复 文件 比对 一行 标准 
2018-07-26 15:35
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:20 
之前的贴 https://bbs.bccn.net/thread-488751-4-1.html
36楼的做法好象就是这样子
2018-07-26 15:48
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用fdxxhjc在2018-7-26 15:35:37的发言:

第三佰十二轮:
第312轮的第1步:以第312行为标准,建立临时文件并将作为标准的第312行记入临时文件,第一行与临时文件作比对,若无重复则第一行记入临时文件,此时临时文件中有20个数,若有重复则临时文件中只有第312行10个数;。。。。直至与312比对,至此运行结束。

第312轮的第1步:以第312行为标准,。。。。直至与311比对就可以。
可以忽略作为标准的行再去比对
2018-07-26 15:53
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
得分:0 
回复 2楼 吹水佬
不是的,前面您的是依次下移的行与标准行作比对,现在要求是依次下移的行与临时文件中记录下的作比对,并且临时文件中的内容是随着比对过程中行的行下移而不断变化(增加着)的
2018-07-26 15:57
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 4楼 fdxxhjc
注释一下,看看有无理解错:
USE 原表 ALIAS 原表 IN 0
USE 比较后 ALIAS 比较后 IN 0
SELECT 比较后
ZAP
    * tmp_比较后,临时表,存放每一轮结果
SELECT * FROM 比较后 INTO CURSOR tmp_比较后 READWRITE
    * 依次以每一行作为标准行与其他各行比对
FOR nRecno=1 TO RECCOUNT("原表") && 从第一行到最后一行   
    SELECT 原表
    GO nRecno
    DIMENSION arr[1]
    SCATTER TO arr     && 第一步,取nRecno行数据作为标准行
    GO TOP
    INSERT INTO tmp_比较后 FROM ARRAY arr &&标准行首先保存到“tmp_比较后”表
    SCAN FOR RECNO()!=nRecno    && 分别与其他各行比对(不含nRecno行)
        SCATTER TO arr_recno    && 取一行数据
        n = ALEN(arr)+10   
        DIMENSION arr_tmp[n]    && 临时比对用的数组
        ACOPY(arr, arr_tmp) && 复制已经比对不重复的数据
        ACOPY(arr_recno, arr_tmp, 1, -1, n-9) &&增加要比对行的数据
        ASORT(arr_tmp)    && 将要比对的数据排序
        ai = arr_tmp[1]   && 开始比对
        FOR i=2 TO n
            IF arr_tmp[i]==ai &&如果有相同(重复)
                EXIT && 比对完
            ELSE
                ai = arr_tmp[i] && 比对下一个数据
            ENDIF
        ENDFOR
        IF i > n && 比对完,无重复时
            DIMENSION arr[n]
            ACOPY(arr_recno, arr, 1, -1, n-9)    && 将当前行数据保存到比对结果
            INSERT INTO tmp_比较后 FROM ARRAY arr_recno &&将当前行数据保存到“tmp_比较后”表
            REPLACE 循环记录 WITH "  第"+TRANSFORM(RECNO("原表"))+"条" IN "tmp_比较后"
        ENDIF
    ENDSCAN
        * 此轮全部比对完,将“tmp_比较后”表添加入“比较后”表
    GO TOP IN "tmp_比较后"
    REPLACE 循环记录 WITH "以第"+TRANSFORM(nRecno)+"为准,有"+TRANSFORM(RECCOUNT("tmp_比较后"))+"条" IN "tmp_比较后"
    INSERT INTO 比较后 SELECT * FROM tmp_比较后
    SELECT tmp_比较后 &&清空“tmp_比较后”表,准备下一轮比对
    ZAP
ENDFOR
SELECT * FROM 比较后 && 显示全部比对后结果

有些中间环节应该还可以优化。

[此贴子已经被作者于2018-7-26 16:25编辑过]

2018-07-26 16:22
gs2536785678
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:565
专家分:1668
注 册:2017-7-16
得分:0 
这样的比较,是为了做啥?
2018-07-26 16:24
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
得分:0 
回复 5楼 吹水佬
先生这一行
   ASORT(arr_tmp)    && 将要比对的数据排序
运行下来说:数据类型不匹配
2018-07-26 16:37
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 7楼 fdxxhjc
VFP9测试未见异常
2018-07-26 16:58
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
改了点,好象会快点。
USE 原表 ALIAS 原表 IN 0
USE 比较后 ALIAS 比较后 IN 0
SELECT 比较后
ZAP
    * tmp_比较后,临时表,存放每一轮结果
SELECT * FROM 比较后 INTO CURSOR tmp_比较后 READWRITE

    * 依次以每一行作为标准行与其他各行比对
FOR nRecno=1 TO RECCOUNT("原表") && 从第一行到最后一行   
    SELECT 原表
    GO nRecno
    DIMENSION arr[1]
    SCATTER TO arr     && 第一步,取nRecno行数据作为标准行
    GO TOP
    INSERT INTO tmp_比较后 FROM ARRAY arr &&标准行首先保存到“tmp_比较后”表
    SCAN FOR RECNO()!=nRecno    && 分别与其他各行比对(不含nRecno行)
        SCATTER TO arr_recno    && 取一行数据
        n = ALEN(arr)
        DIMENSION arr_tmp[n]
        ACOPY(arr, arr_tmp)    &&临时保存原比对结果数据
        n = n+10
        DIMENSION arr[n]
        ACOPY(arr_recno, arr, 1, -1, n-9) &&增加要比对行的数据
        ASORT(arr)    && 将要比对的数据排序
        ai = arr[1]   && 开始比对
        FOR i=2 TO n
            IF arr[i]==ai &&如果有相同(重复)
                EXIT && 比对完
            ELSE
                ai = arr[i] && 比对下一个数据
            ENDIF
        ENDFOR
        IF i > n && 比对完,无重复时
            INSERT INTO tmp_比较后 FROM ARRAY arr_recno &&将nRecno行数据保存到“tmp_比较后”表
            REPLACE 循环记录 WITH "  第"+TRANSFORM(RECNO("原表"))+"条" IN "tmp_比较后"
        ELSE
            DIMENSION arr[n-10]
            ACOPY(arr_tmp, arr) &&有重复时,恢复原比对结果
        ENDIF
    ENDSCAN
        * 此轮全部比对完,将“tmp_比较后”表添加入“比较后”表
    GO TOP IN "tmp_比较后"
    REPLACE 循环记录 WITH "以第"+TRANSFORM(nRecno)+"为准,有"+TRANSFORM(RECCOUNT("tmp_比较后"))+"条" IN "tmp_比较后"
    INSERT INTO 比较后 SELECT * FROM tmp_比较后
    SELECT tmp_比较后 &&清空“tmp_比较后”表,准备下一轮比对
    ZAP
ENDFOR
SELECT * FROM 比较后 && 显示全部比对后结果
2018-07-26 17:02
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
得分:0 
回复 8楼 吹水佬
先生我安装的也是vfp9,怎么运行到这一行会提示这个呢

现在是换了行的提示语
  ASORT(arr)    && 将要比对的数据排序

数据类型不匹配


哦,没有换行,还是老位置,是括号内的变量改了
 arr_tmp  改成了arr

[此贴子已经被作者于2018-7-26 17:07编辑过]

2018-07-26 17:02



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-488828-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.160518 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved