| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2593 人关注过本帖, 1 人收藏
标题:请教数据替换
只看楼主 加入收藏
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
结帖率:73.44%
收藏(1)
已结贴  问题点数:20 回复次数:10 
请教数据替换
现有表1(500行,6列),其中的每个数据值都与表2(24行,3列)的第一列中的某个数据值相等.
现要求表1的第一行的6个值分别与表2的第一列的值相比较,若表1的第一行的第一个值与表2的第一列的某个值相同,则将表2中该值所在行的列2、列3的值写入到结果表中的第一、二列;当表1的第一行的第二个值与表2的第一列的某个值相同,则将表2中该值所在行的列2、列3的值写入到结果表中的第三、四列,依此类推,当表1的第一行的第六个值与表2的第一列的某个值相同,则将表2中该值所在行的列2、列3的值写入到结果表中的第十一、十二列。再依次作表1第二行的比较,直至表1比较完为止。
为说明问题,举例如下
表1的第一行的第一个数为2305,这2305在表2的第一列中的第1行,而表2中2305后面的二个数为1、48,则就把1、48写入到结果表的第一行的第1、2列,表1的第一行的第二个数为1201,这1201在表2的第一列中的第24行,而表2中1201后面的二个数为24、25,则就把24、25写入到结果表的第一行的第3、4列。。。。,表1的第一行的第六个数为1345,这1345在表2的第一列中的第16行,而表2中1345后面的二个数为16、33,则就把16、33写入到结果表的第一行的第11、12列;依此类推,谢谢(表1、表2和替换后的结果表的第一行样式贴上,但贴上后有点变形了,表及程序文件在压缩包中
替换请教.rar (4.23 KB)

                  表1                    表2                                                        结果表                                            
列1    列2    列3    列4    列5    列6    列1    列2    列3    列1    列2    列3    列4    列5    列6    列7    列8    列9    列10    列11    列12
2305    1201    1225    2041    1565    1345    2305    1    48    1    48    24    25    21    28    4    45    11    38    16    33
部分代码如下:
CLEAR
CLOSE  all
SET SAFETY OFF
set talk off
*------------------
SELECT 1
USE 表1
HS1=RECCOUNT()
LS1=FCOUNT()
DIMENSION b1(hs1,ls1)
select * from 表1 into array b1
USE 表2
HS2=RECCOUNT()
LS2=FCOUNT()
DIMENSION b2(hs2,ls2)
select * from 表2 into array b2
*-------------------
USE 结果表
PACK
ZAP
APPEND BLANK
  FOR i=1 TO 23
  *--以下需用替换的代码,但组织不好,请先生指点,谢谢
  
        REPLACE  ('列'+ALLTRIM(STR(i))) WITH  b2(i,1)
        REPLACE  ('列'+ALLTRIM(STR(i+1))) WITH  b2(i,2)
 APPEND BLANK        
  endfor
*-------------------
?'      本次运行结束'
2016-04-09 10:03
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
找到才能替换,否则数据为0

坚守VFP最后的阵地
2016-04-09 11:20
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
不知道我理解的对吗,最后的结果表应该有 78 条记录,是吗?

Select Distinct ;
    T2.列2 As 列1,  T2.列3 As 列2, ;
    T3.列2 As 列3,  T3.列3 As 列4, ;
    T4.列2 As 列5,  T4.列3 As 列6, ;
    T5.列2 As 列7,  T5.列3 As 列8, ;
    T6.列2 As 列9,  T6.列3 As 列10,;
    T7.列2 As 列11, T7.列3 As 列12 ;
    From 表1 T1;
    Left Join 表2 T2 On T2.列1 = T1.列1 ;
    Left Join 表2 T3 On T3.列1 = T1.列2 ;
    Left Join 表2 T4 On T4.列1 = T1.列3 ;
    Left Join 表2 T5 On T5.列1 = T1.列4 ;
    Left Join 表2 T6 On T6.列1 = T1.列5 ;
    Left Join 表2 T7 On T7.列1 = T1.列6

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-09 12:55
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
SET SAFETY OFF 
CLOSE DATABASES 
USE 结果表
ZAP
SELECT * FROM 表2 INTO ARRAY AB
SELECT * FROM 表1 INTO CURSOR B1
SCAN 
    cStr=""
    FOR I=1 TO FCOUNT("B1")
        nValue=EVALUATE(FIELD(I,"B1"))
        IF ASCAN(AB,nValue)>0
            BH=ASCAN(AB,nValue) && 获取数组AB元素编号
            NROW=ASUBSCRIPT(AB,BH,1) && 获取数组AB查找到的数据的行号
            cStr=cStr+TRANSFORM(AB[NROW,2])+","+TRANSFORM(AB[NROW,3])+","
        ENDIF     
    ENDFOR 
    cStr=LEFT(cStr,LEN(cStr)-1)
    nRow=ALINES(AC,cStr,",")
    DIMENSION AC[1,nRow]
    INSERT INTO 结果表 FROM ARRAY AC
ENDSCAN 

SELECT 结果表
BROWSE

坚守VFP最后的阵地
2016-04-09 13:21
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:335
帖 子:9841
专家分:27213
注 册:2012-2-5
收藏
得分:0 
程序代码:
SET SAFETY OFF 
CLOSE DATABASES 
USE 结果表
ZAP
SELECT * FROM 表2 INTO ARRAY AB
SELECT * FROM 表1 INTO CURSOR B1
SCAN &&FOR RECNO()<=10
    LOCAL AC[1,12]
    FOR I=1 TO FCOUNT("B1")
        nValue=EVALUATE(FIELD(I,"B1"))
        IF ASCAN(AB,nValue)>0
            BH=ASCAN(AB,nValue) && 获取数组AB元素编号
            =ACOPY(AB,AC,BH+1,2,(I-1)*2+1)
        ENDIF     
    ENDFOR 
    INSERT INTO 结果表 FROM ARRAY AC
ENDSCAN 
SELECT 结果表
BROWSE

用数组方法处理,结果表中的数据类型全部改为数值型

[此贴子已经被作者于2016-4-9 13:54编辑过]


坚守VFP最后的阵地
2016-04-09 13:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:0 
数据量不大,用LOCATE逐个找也可以。
数据量大的话可以用关联统计。
程序代码:
CREATE CURSOR 结果表 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                      列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I,;
                      列07 I, 列08 I, 列09 I, 列10 I, 列11 I, 列12 I)
APPEND FROM 表1.dbf
USE 表2 IN 0
SELECT 表2
INDEX on 列1 TAG 列1
SELECT 结果表
FOR i = 1 TO 6
    cmd = [SET RELATION TO ] + FIELD(i, "结果表") + [ INTO "表2"]
    *SELECT 结果表
    EXECSCRIPT(cmd)
    REPLACE ("列"+PADL(2*i-1,2,"0")) WITH 表2.列2,;
            ("列"+PADL(2*i,  2,"0")) WITH 表2.列3 ALL IN "结果表"
ENDFOR
GO TOP
BROWSE &&FIELDS 列01,列02,列03,列04,列05,列06,列07,列08,列09,列10,列11,列12


还可以这样,速度更快。
程序代码:
CREATE CURSOR 结果表 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                      列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I,;
                      列07 I, 列08 I, 列09 I, 列10 I, 列11 I, 列12 I)
APPEND FROM 表1.dbf
USE 表2 IN 0
SELECT * FROM 表2 INTO CURSOR 表22 READWRITE 
SELECT * FROM 表2 INTO CURSOR 表23 READWRITE 
SELECT * FROM 表2 INTO CURSOR 表24 READWRITE 
SELECT * FROM 表2 INTO CURSOR 表25 READWRITE 
SELECT * FROM 表2 INTO CURSOR 表26 READWRITE 
SELECT 表2
INDEX on 列1 TAG 列1
SELECT 表22
INDEX on 列1 TAG 列1
SELECT 表23
INDEX on 列1 TAG 列1
SELECT 表24
INDEX on 列1 TAG 列1
SELECT 表25
INDEX on 列1 TAG 列1
SELECT 表26
INDEX on 列1 TAG 列1
SELECT 结果表
SET RELATION TO 列1 INTO "表2",;
                列2 INTO "表22",;
                列3 INTO "表23",;
                列4 INTO "表24",;
                列5 INTO "表25",;
                列6 INTO "表26"
REPLACE 列01 WITH 表2.列2,  列02 WITH 表2.列3,;
        列03 WITH 表22.列2, 列04 WITH 表22.列3,;
        列05 WITH 表23.列2, 列06 WITH 表23.列3,;
        列07 WITH 表24.列2, 列08 WITH 表24.列3,;
        列09 WITH 表25.列2, 列10 WITH 表25.列3,;
        列11 WITH 表26.列2, 列12 WITH 表26.列3 ALL 
GO TOP
BROWSE &&FIELDS 列01,列02,列03,列04,列05,列06,列07,列08,列09,列10,列11,列12


[此贴子已经被作者于2016-4-10 07:16编辑过]

2016-04-09 17:39
aaaaaa
Rank: 8Rank: 8
等 级:贵宾
威 望:21
帖 子:796
专家分:937
注 册:2012-9-4
收藏
得分:0 
如果是显示所有行,去掉 Distinct 子句/参数,结果表有 500 行。

Select ;
    T2.列2 As 列1,  T2.列3 As 列2, ;
    T3.列2 As 列3,  T3.列3 As 列4, ;
    T4.列2 As 列5,  T4.列3 As 列6, ;
    T5.列2 As 列7,  T5.列3 As 列8, ;
    T6.列2 As 列9,  T6.列3 As 列10,;
    T7.列2 As 列11, T7.列3 As 列12 ;
    From 表1 T1;
    Left Join 表2 T2 On T2.列1 = T1.列1 ;
    Left Join 表2 T3 On T3.列1 = T1.列2 ;
    Left Join 表2 T4 On T4.列1 = T1.列3 ;
    Left Join 表2 T5 On T5.列1 = T1.列4 ;
    Left Join 表2 T6 On T6.列1 = T1.列5 ;
    Left Join 表2 T7 On T7.列1 = T1.列6

民工子弟学校22班团小组长阳光模特队长冲锋篮球队前锋小苹果合唱队领唱蓝天舞蹈队编舞
2016-04-09 18:21
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
CREATE CURSOR 结果表 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                      列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I,;
                      列07 I, 列08 I, 列09 I, 列10 I, 列11 I, 列12 I)
APPEND FROM 表1.dbf
USE 表2 IN 0
SELECT 表2
INDEX on 列1 TAG 列1
SELECT 结果表
FOR i = 1 TO 6
    cmd = [SET RELATION TO ] + FIELD(i, "结果表") + [ INTO "表2"]
    *SELECT 结果表
    EXECSCRIPT(cmd)
    REPLACE ("列"+PADL(2*i-1,2,"0")) WITH 表2.列2,;
            ("列"+PADL(2*i,  2,"0")) WITH 表2.列3 ALL IN "结果表"
ENDFOR
GO TOP
BROWSE &&FIELDS 列01,列02,列03,列04,列05,列06,列07,列08,列09,列10,列11,列12

先生您好,此段代码可以替换了,但我想将替换后的结果显示作如下改变:原表1中的第一行第一个值2305对应在表2中的值是1、48,且在结果表中这1和48显示为横排,原表1中的第一行第二个值2213对应在表2中的值是2、47,且在结果表中这2和47显示也是横排,即:显示结果为1、48、2、47。。。。
现在要求将原表1中的第一行第一个值2305对应在表2中的值是1、48,且在结果表中这1和48显示为竖排,原表1中的第一行第二个值2213对应在表2中的值是2、47,且在结果表中这2和47显示也是竖排,即:显示结果为
1     2
48    47  。。。。
谢谢先生
2016-04-10 12:05
fdxxhjc
Rank: 1
等 级:新手上路
帖 子:305
专家分:0
注 册:2014-4-10
收藏
得分:0 
回复 8楼 fdxxhjc
代码作了些修改,但结果不对
CREATE CURSOR 结果表 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                      列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I)
APPEND FROM 表1.dbf
USE 表2 IN 0
SELECT 表2
INDEX on 列1 TAG 列1
SELECT 结果表
FOR i = 1 TO 6
    cmd = [SET RELATION TO ] + FIELD(i, "结果表") + [ INTO "表2"]
      EXECSCRIPT(cmd)   
    REPLACE ("列"+PADL(i,2,"0")) WITH 表2.列2  ALL IN "结果表"
     cmd = [SET RELATION TO ] + FIELD(i, "结果表") + [ INTO "表2"]   
     EXECSCRIPT(cmd)
    REPLACE ("列"+PADL(i,2,"0")) WITH 表2.列3  ALL IN "结果表"   
ENDFOR

COPY TO 结果表2
GO TOP
BROWSE &&FIELDS 列01,列02,列03,列04,列05,列06,列07,列08,列09,列10,列11,列12

2016-04-10 12:08
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:451
帖 子:10607
专家分:43186
注 册:2014-5-20
收藏
得分:20 
是不是这效果:
图片附件: 游客没有浏览图片的权限,请 登录注册

程序代码:
CREATE CURSOR 结果表  (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                       列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I, ID I)
CREATE CURSOR 结果表2 (列1 I, 列2 I, 列3 I, 列4 I, 列5 I, 列6 I,;
                       列01 I, 列02 I, 列03 I, 列04 I, 列05 I, 列06 I, ID I)
SELECT 结果表
APPEND FROM 表1.dbf
REPLACE ID WITH RECNO() ALL 
SELECT 结果表2
APPEND FROM 表1.dbf
REPLACE ID WITH RECNO() ALL 
USE 表2 IN 0
SELECT 表2
INDEX on 列1 TAG 列1
FOR i = 1 TO 6
    cmd = [SET RELATION TO ] + FIELD(i, "结果表") + [ INTO "表2"]
    SELECT 结果表
    EXECSCRIPT(cmd)
    REPLACE ("列"+PADL(i,2,"0")) WITH 表2.列2 ALL IN "结果表"
    SELECT 结果表2
    EXECSCRIPT(cmd)
    REPLACE ("列"+PADL(i,2,"0")) WITH 表2.列3 ALL IN "结果表2"
ENDFOR
SELECT 结果表
APPEND FROM DBF("结果表2")
INDEX on ID TAG ID
GO TOP
*BROWSE
BROWSE FIELDS 列1,列2, 列01,列02
2016-04-10 15:06
快速回复:请教数据替换
数据加载中...
 
   



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

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