注册 登录
编程论坛 VFP论坛

如何实现打开指定文件夹中文件并合并?

杂七杂八 发布于 2022-07-12 19:55, 2212 次点击
程序代码:
cPath=Sys(5)+Sys(2003)+"\ABC\"

lnFiles=Adir(aFile,cPath+"kqb^*.dbf" )

 
  Use aFile(1,1)  &&&&???
      
  Copy Structure To AAA           &&&另存在ABC文件夹中
  Use AAA                          
  For lnI=1 To lnFiles               
      lcStr=(aFile(lnI,1))     
    Append From '&lcStr.'        &&&合并后的文件在ABC文件夹中
  ENDFOR
  [local]1[/local]

请问如何修改命令,才能实现目的。
谢谢!
17 回复
#2
杂七杂八2022-07-12 19:56
只有本站会员才能查看附件,请 登录

这是附件
#3
吹水佬2022-07-12 22:00
试试用括号将文件名括起来,如:
Use (aFile(1,1))
Append From (lcStr)
#4
杂七杂八2022-07-13 05:18
回复 3楼 吹水佬
只有本站会员才能查看附件,请 登录


 我用VFP6.0

[此贴子已经被作者于2022-7-13 05:20编辑过]

#5
杂七杂八2022-07-13 06:33
程序代码:
***在一个名为A123文件夹里有个程序打开文件程序PP.prg

cPath=Sys(5)+Sys(2003)+"\ABC\"

lnFiles=Adir(aFile,cPath+"kqb^*.dbf" )

 
  *Use aFile(1,1)  &&&&???
  Use (cPath+aFile(1,1))  
      
  Copy Structure To ABC\AAA           &&&另存在ABC文件夹中
  Use ABC\AAA                          
  For lnI=1 To lnFiles               
      lcStr=(aFile(lnI,1))     
    Append From '&cPath&lcStr.'        &&&合并后的文件在ABC文件夹中
  
  ENDFOR
  
  BROW

搞了一个早上,这样能达到目的,命令语句还能优化吗?
#6
mywisdom882022-07-13 08:40
以前DOS的时候,可以用 copy a1.txt + a2.txt 这样合拼多个txt文件的,不知道DBF,能否利用这样。。。
#7
吹水佬2022-07-13 09:23
以下是引用mywisdom88在2022-7-13 08:40:52的发言:

以前DOS的时候,可以用 copy a1.txt + a2.txt 这样合拼多个txt文件的,不知道DBF,能否利用这样。。。

dos copy 是低级文件函数操作,相当于VFP用 FREAD()、FWRITE()等。
VFP也可以用低级文件函数来处理相同结构的DBF:文件头块 + 数据块DBF1 +  数据块DBF2 + ......,最后要修改文件头块中的记录数值。
#8
mywisdom882022-07-13 12:38
以下是引用吹水佬在2022-7-13 09:23:04的发言:


dos copy 是低级文件函数操作,相当于VFP用 FREAD()、FWRITE()等。
VFP也可以用低级文件函数来处理相同结构的DBF:文件头块 + 数据块DBF1 +  数据块DBF2 + ......,最后要修改文件头块中的记录数值。

吹斑竹,搞个函数出来玩玩。。。
#9
吹水佬2022-07-13 15:16
以下是引用mywisdom88在2022-7-13 12:38:48的发言:


吹斑竹,搞个函数出来玩玩。。。

简单示例
程序代码:

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
#10
schtg2022-07-14 06:17
谢谢吹版!
#11
nbwww2022-07-14 06:36
以下是引用吹水佬在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

#12
吹水佬2022-07-14 07:51
回复 9楼 吹水佬
这种方法稍为修改一下就可以用来修复损坏的DBF表
#13
mywisdom882022-07-14 08:28
没搞过,还能有这个作用的阿
#14
hu9jj2022-07-14 08:36
回复 6楼 mywisdom88
肯定不行,因为DBF文件前部是文件头,包含了字段的定义等内容,简单的合并则不会自动剔除第二个DBF文件的文件头部分。
#15
sostemp2022-07-14 09:26
#16
吹水佬2022-07-14 09:31
以下是引用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
#17
schtg2022-07-14 11:46
回复 16楼 吹水佬
威武!
#18
bdx8082022-07-14 17:17
谢谢!学习了
1