标题:如何实现打开指定文件夹中文件并合并?
只看楼主
nbwww
Rank: 6Rank: 6
等 级:贵宾
威 望:10
帖 子:222
专家分:468
注 册:2021-1-9
得分:0 
以下是引用吹水佬在2022-7-13 15:16:53的发言:


简单示例

cDefPath = ADDBS(JUSTPATH(SYS(16)))
SET DEFAULT TO (cDefPath)

CREATE TABLE dbf1 (f1 c(11), f2 I, f3 n(9,2))
INSERT INTO dbf1 VALUES ("aa", 1, 1.12)
INSERT INTO dbf1 VALUES ("bb", 2, 2.23)
USE
CREATE TABLE dbf2 (f1 c(11), f2 I, f3 n(9,2))
INSERT INTO dbf2 VALUES ("cc", 3, 3.34)
INSERT INTO dbf2 VALUES ("dd", 4, 4.45)
INSERT INTO dbf2 VALUES ("ee", 5, 5.56)
USE
dbf1 = FILETOSTR("dbf1.dbf")
dbf2 = FILETOSTR("dbf2.dbf")
nDataOffset = CTOBIN(SUBSTR(dbf1,9,2),"2rs") + 1       && 数据块偏移量
nRecords = CTOBIN(SUBSTR(dbf1,5,4),"4rs")              && dbf 记录数
nRecords = nRecords + CTOBIN(SUBSTR(dbf2,5,4),"4rs")   && 合并表记录数
dbf = STUFF(dbf1,5,4,BINTOC(nRecords,"4rs"))           && 取最前的表,修改记录数
dbf = LEFT(dbf,LEN(dbf)-1)                             && 前面的表去除文件结束标志
dbf = dbf + SUBSTR(dbf2,nDataOffset)                   && 追加最后的表(保留文件结束标志)
STRTOFILE(dbf,"dbf.dbf")                               && 保存合并的表
SELECT * FROM dbf
CLOSE TABLES ALL
DELETE FILE dbf.dbf
DELETE FILE dbf1.dbf
DELETE FILE dbf2.dbf

2022-07-14 06:36
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
回复 9楼 吹水佬
这种方法稍为修改一下就可以用来修复损坏的DBF表
2022-07-14 07:51
mywisdom88
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:190
帖 子:3125
专家分:8340
注 册:2015-3-25
得分:0 
没搞过,还能有这个作用的阿
2022-07-14 08:28
hu9jj
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:红土地
等 级:贵宾
威 望:396
帖 子:11713
专家分:43267
注 册:2006-5-13
得分:0 
回复 6楼 mywisdom88
肯定不行,因为DBF文件前部是文件头,包含了字段的定义等内容,简单的合并则不会自动剔除第二个DBF文件的文件头部分。

活到老,学到老! http://www. E-mail:hu-jj@
2022-07-14 08:36
sostemp
Rank: 4
等 级:业余侠客
威 望:8
帖 子:162
专家分:221
注 册:2009-6-2
得分:0 
2022-07-14 09:26
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用mywisdom88在2022-7-14 08:28:23的发言:

没搞过,还能有这个作用的阿

程序代码:

CREATE TABLE dbf (f1 c(11), f2 I, f3 n(9,2))
INSERT INTO dbf VALUES ("cc", 3, 3.34)
INSERT INTO dbf VALUES ("dd", 4, 4.45)
INSERT INTO dbf VALUES ("ee", 5, 5.56)
USE
dbf = FILETOSTR("dbf.dbf")
dbf = LEFT(dbf,LEN(dbf)-10) && 模拟存盘不正常
STRTOFILE(dbf,"dbf.dbf")    
SELECT * FROM dbf           && 抛出异常,按“忽略”继续修复                                
nDataOffset = CTOBIN(SUBSTR(dbf, 9,2),"2rs")                && 数据块偏移量
nRecordSize = CTOBIN(SUBSTR(dbf,11,2),"2rs")                && 记录长度
**nRecords    = INT((LEN(dbf)-nDataOffset)/nRecordSize)       && 有效记录数据
nRecords    = CEILING((LEN(dbf)-nDataOffset)/nRecordSize)   && 尽可能多的数据
dbf = PADR(dbf, nDataOffset+nRecordSize*nRecords, 0h00)
dbf = STUFF(dbf,5,4,BINTOC(nRecords,"4rs")) + 0h1A          && 修改记录数和添加文件结束标志
STRTOFILE(dbf,"dbf.dbf")
SELECT * FROM dbf
2022-07-14 09:31
schtg
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:https://t.me/pump_upp
等 级:贵宾
威 望:67
帖 子:1355
专家分:2534
注 册:2012-2-29
得分:0 
回复 16楼 吹水佬
威武!
2022-07-14 11:46
bdx808
Rank: 1
等 级:新手上路
帖 子:53
专家分:0
注 册:2009-5-9
得分:0 
谢谢!学习了
2022-07-14 17:17



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




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

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