注册 登录
编程论坛 VFP论坛

请教:判断文件夹下多个dbf文件并自动追加

chychychy 发布于 2023-09-18 16:20, 791 次点击
只有本站会员才能查看附件,请 登录

文件夹下有多个相同结构dbf文件(有时几十个),想将他们合并到一个文件中,尝试了一段小程序但错误,请高手指教。

只有本站会员才能查看附件,请 登录


只有本站会员才能查看附件,请 登录

同时请教,
1.库结构相同,如何自动判断建立空白库
2.文件夹下若有子目录(比如6、7),如何穿透追加子文件夹下dbf文件

[此贴子已经被作者于2023-9-18 17:00编辑过]

16 回复
#2
schtg2023-09-18 20:23
回复 楼主 chychychy
加上括号即可
只有本站会员才能查看附件,请 登录

也可以试一试:
只有本站会员才能查看附件,请 登录

程序代码:
clear
close databases

create cursor  hb (xxmc c(40),xm c(20),xjh c(23),yycj c(6),mscj c(6))  &&&建立一个空白表

path=getdir()
lnfiles=adir(afile,path+'*.dbf')
* ? lnfiles[color=#808080]&& 显示数据库数目[/color]
for ncount = 1 to alen(afile,1)  && 遍历数据库
   表名 = afile(ncount,1)  && 显示数据库名
   ? 表名
   select hb
   append from (表名)
endfor
select hb
browse


[此贴子已经被作者于2023-9-18 20:29编辑过]

#3
z126892023-09-19 09:15
#4
chychychy2023-09-19 09:21
回复 2楼 schtg
测试正确,谢谢
#5
chychychy2023-09-19 17:52
回复 2楼 schtg
Close Databases All
Clear
Create Cursor  hb (xxmc c(40),xm c(20),xjh c(23),yycj c(6),mscj c(6))  &&&建立一个空白表
Adir(afile,Sys(5)+Sys(2003)+'\*.dbf')        && 获取当前目录下所有dbf文件
?Alen(afile,1)
For ncount = 1 To Alen(afile,1)  && 遍历数据库
    表名 = afile(ncount,1)  && 显示数据库名
    ? 表名
    Select hb
    Append From (表名)
Endfor
Select hb
Browse
Select xxmc,Count(*) As rs Group By 1 From hb
&&&path=getdir(),这个语句在运行起来必须要放在数据所在文件夹下,否则找不到Adir(afile,Sys(5)+Sys(2003)+'\*.dbf')  &&这个可以获取当前目录下所有dbf文件,
抛砖引玉请高手再提供更好思路帮助解决
1.库结构相同,如何自动判断建立空白库
2.文件夹下若有子目录(比如6、7),如何穿透追加子文件夹下dbf文件
3.? 表名后排序及导入合并后顺序是1、10、11,2、20、21,3、4、5,如何实现1、2、3、4……10、11这样排序。(我用的笨办法改成了01、02、03)

[此贴子已经被作者于2023-9-19 18:07编辑过]

#6
schtg2023-09-20 06:53
回复 5楼 chychychy
1.用select * from 表名 就可以创建结构相同的空表。
2.用遍历方法就可获得当前文件夹及其以下文件夹里的文件。
3.将这些数据改为数值型,用升序排序后导入即可,最好有一些测试数据方便说明操作哈。

[此贴子已经被作者于2023-9-20 06:58编辑过]

#7
chychychy2023-09-20 11:23
回复 6楼 schtg
只有本站会员才能查看附件,请 登录

只有本站会员才能查看附件,请 登录

排列不是1、2、3、4的顺序,而是10、1、2、3、的顺序了,求教
#8
tjdeming2023-09-20 11:34
按01,02,03,10二位数取文件名
#9
schtg2023-09-20 11:45
回复 7楼 chychychy
试一试,可否?
只有本站会员才能查看附件,请 登录

程序代码:
create cursor  hb (xxmc c(40),xm c(20),xjh c(23),yycj c(6),mscj c(6))  &&&建立一个空白表
adir(afile,sys(5)+sys(2003)+'\*.dbf')        && 获取当前目录下所有dbf文件
for ncount = 1 to alen(afile,1)  && 遍历数据库
   表名 = afile(ncount,1)  && 显示数据库名
   select hb
   append from (表名)
endfor
select *,val(xxmc) as px from hb order by px
#10
chychychy2023-09-20 14:43
回复 9楼 schtg
谢谢!如何让获取文件名时就达到这样的效果,然后“?表名”这个地方可以看出这样排列

[此贴子已经被作者于2023-9-20 14:49编辑过]

#11
schtg2023-09-20 19:25
回复 10楼 chychychy
将获取的文件名称,插入数据表 → 按此方法排序 → 按照排序后的记录,依次获取文件名即可。不知是否是这个意思?
#12
chychychy2023-09-21 09:50
回复 11楼 schtg
差不多吧。应该是我表达的不够清楚。我的意思是dbf文件的名有顺序1、2、3……10、11……20。想让合并的数据库记录也是按照这个顺序依次导入。
但目前出现
?表名是10、1、20、2、3、4、5……略号的顺序。
导入文件的顺序也是这样10、1、20、2、3、4、5……顺序
For ncount = 1 To Alen(afile,1)  && 遍历数据库
    表名 = afile(ncount,1) && 显示数据库名

这个地方如何实现1、2、3……10、11……20的顺序,没想出来,求教

[此贴子已经被作者于2023-9-21 10:53编辑过]

#13
schtg2023-09-21 10:46
回复 12楼 chychychy
是这个意思吗?
只有本站会员才能查看附件,请 登录

程序代码:
create cursor  wj (wjm c(40),px n(6,0))  &&&建立一个空白表
create cursor  hb (xxmc c(40),xm c(20),xjh c(23),yycj c(6),mscj c(6))  &&&建立一个空白表
adir(afile,sys(5)+sys(2003)+'\*.dbf')        && 获取当前目录下所有dbf文件
for ncount = 1 to alen(afile,1)
   表名 = afile(ncount,1)
   insert into wj(wjm,px) values(alltrim(表名),val(表名))
endfor
select * from wj order by px into cursor wjb
select wjb
go top
scan
   文件名 = alltrim(wjm) && 显示数据库名
   ? 文件名
   select hb
   append from (文件名)
endscan
select hb
browse


[此贴子已经被作者于2023-9-21 10:48编辑过]

#14
chychychy2023-09-21 10:54
回复 13楼 schtg
完全符合要求
#15
dbf永动机2023-09-27 09:21
回复 13楼 schtg
建立空表的代码还能优化吗?,因为这个代码只适用这个结构的表,换个表就要改代码,比如获取第一个表copy stru 到一个新表,或者直接手动复制一个表改成总表,代码直接 use 总表,zap,然后再继续后面的代码。
#16
abcde0072023-09-27 10:09
回复 7楼 chychychy
以下是引用chychychy在2023-9-20 11:23:06的发言:







排列不是1、2、3、4的顺序,而是10、1、2、3、的顺序了,求教



程序在比较大小时,将10与1A进行比较了。你把数字放在最后试试看。

[此贴子已经被作者于2023-9-27 10:15编辑过]

#17
abcde0072023-09-27 10:18
以下是引用tjdeming在2023-9-20 11:34:57的发言:

按01,02,03,10二位数取文件名



这种方法也行
1