vfp如何高效率导入大量数据

shanyejunjie 2009-03-14 01:37:07
哪位老师帮帮忙,如何能高效率的把下面这个文件中的数据排列成4列,我做的效率非常低,需要几个小时才能完成。数据下载地址:
http://download.csdn.net/source/1104947
...全文
463 49 打赏 收藏 转发到动态 举报
写回复
用AI写文章
49 条回复
切换为时间正序
请发表友善的回复…
发表回复
xy111222333 2009-04-04
  • 打赏
  • 举报
回复
高手如林啊,哈哈~~~~~·····
WWWWA 2009-04-04
  • 打赏
  • 举报
回复
学习了
shanyejunjie 2009-04-04
  • 打赏
  • 举报
回复
t1=SECONDS( )
DECLARE sed (CEILING(ALINES(sed,FILETOSTR("D:\数据\GM4\2009\04\32\200904013120igea4032.sed"),2," " )/4),4)
CREATE CURSOR sed(n1 c(12),n2 c(12),n3 c(12),n4 c(12))
APPEND FROM ARRAY sed
?SECONDS( )-t1,RECCOUNT()
哈哈,这样改一下,时间再减少一个数量级,0.27秒
shanyejunjie 2009-03-27
  • 打赏
  • 举报
回复
哈哈,几天没上了,居然发现这么多高手在探讨,看来我是中大奖了啊
wwwwb 2009-03-25
  • 打赏
  • 举报
回复
VFP确实与其它数据库不一样,其它如MYSQL、SQLANYWHERE、SQLSERVER、
SQLITE等等,要导入这么多数据,速度不会这么快。
wwwwb 2009-03-25
  • 打赏
  • 举报
回复
用数组的方法是要求内存比较大的情况下,如果是海量数据不太适合。
cbl518 2009-03-24
  • 打赏
  • 举报
回复
这样更快!!!
DECLARE sed (CEILING(ALINES(sed,FILETOSTR("g:\temp\200903123120igea4033.sed"),2," " )/4),4)
CREATE TABLE G:\temp\sed(n1 c(12),n2 c(12),n3 c(12),n4 c(12))
APPEND FROM ARRAY sed
cbl518 2009-03-24
  • 打赏
  • 举报
回复
t1=SECONDS( )

ALINES(sed,FILETOSTR("g:\temp\200903123120igea4033.sed"),2," " )
DECLARE sed (CEILING(ALEN(sed)/4),4)
CREATE TABLE G:\temp\sed(n1 c(12),n2 c(12),n3 c(12),n4 c(12))
APPEND FROM ARRAY sed

?SECONDS( )-t1,RECCOUNT()
cbl518 2009-03-24
  • 打赏
  • 举报
回复
我的挣分的梦白做了!!!

都市夜猫 2009-03-24
  • 打赏
  • 举报
回复
其实这个问题能从几小时优化到几秒,已经够了,再怎么优化也不再是数量级的变化了。
也可以试试用数组的方法,在数据量不超过内存容量限制的情况下,可以减少一次重新写入磁盘的花费,这样试试:

m.lcString = FILETOSTR(GETFILE('sed'))
ALINES(laTemp, m.lcString, ' ')
DIMENSION laTemp[ALEN(laTemp)/4, 4]
CREATE CURSOR ttt (f1 C(10), f2 C(10), f3 C (10), f4 C(10))
APPEND FROM ARRAY laTemp

WWWWA 2009-03-24
  • 打赏
  • 举报
回复
[Quote=引用 36 楼 cbl518 的回复:]
用这种追加数据,再查询的方式,最短时间也要2.5秒了!

如果楼主还嫌慢的话,
那你就把 分加到 500.
我可以用0.5秒钟,仅 4句短语句就完成你的数据转换任务!!!
哈哈!!!
vfp 变化无穷!只有你用心了,就有收获!
[/Quote]
呵呵,期待cbl518 的代码,除了转入DBF,再转置,
确实还没有想到其它方法
WWWWA 2009-03-24
  • 打赏
  • 举报
回复
1、修改为CHRTRAN后,速度确实提高;
2、测试一下下面代码,虽然比SQL语句代码多一点,似乎速度
更快一些
t1=SECONDS()
cLEAR
CLEAR ALL
SET SAFETY OFF
t1=SECONDS( )
STRTOFILE(CHRTRAN(FILETOSTR("d:\zz\数据.sed")," ",CHR(13)),"d:\zz\temp8.txt")
CREATE CURSOR sed(n1 c(12))
APPEND FROM d:\zz\temp8.txt SDF
SELECT *,RECNO() as jl,CEILING(RECNO()/4) as bz FROM sed INTO ARRAY zz1
ff=ALEN(zz1,1)
ff2=IIF(ff/4=INT(ff/4),ff/4,INT(ff/4)+1)
PUBLIC array zz2(ff2,4)
ff1=zz1(1,3)
j=1
FOR i=1 TO ff
j=IIF(ff1<>zz1(i,3),j+1,j)
ff1=IIF(ff1<>zz1(i,3),zz1(i,3),ff1)
ttf1=IIF(MOD(zz1(i,2),4)=0,4,MOD(zz1(i,2),4))
zz2(j,ttf1)=zz1(i,1)
ENDFOR
CREATE CURSOR ddq(n1 c(12),n2 c(12),n3 c(12),n4 c(12))
APPEND FROM ARRAY zz2
?SECONDS()-t1
cbl518 2009-03-23
  • 打赏
  • 举报
回复
楼主的结果是:86403 条记录!

最后的几条记录是:
N1 N2 N3 N4
-91.16 13.85 20.02 -3.22
-91.11 13.85 20.00 -3.21
-91.09 13.85 19.96 -3.22
-91.02 13.85 19.94 -3.21
-91.06 13.85 ack

对吗???
cbl518 2009-03-23
  • 打赏
  • 举报
回复
用这种追加数据,再查询的方式,最短时间也要2.5秒了!

如果楼主还嫌慢的话,
那你就把 分加到 500.
我可以用 0.5 秒钟,仅 4句短语句就完成你的数据转换任务!!!
哈哈!!!
vfp 变化无穷!只有你用心了,就有收获!
cbl518 2009-03-23
  • 打赏
  • 举报
回复
这样楼主就可以在 3 秒内,完成数据的转换了!
cbl518 2009-03-23
  • 打赏
  • 举报
回复
关于: 时间主要用在存储TXT文件上了,真正查询时间用的很少
的问题。

请试试看:

t1=SECONDS( )
*STRTOFILE(STRTRAN(FILETOSTR("g:\temp\200903123120igea4033.sed")," ",CHR(13)),"g:\temp\temp8.txt")
STRTOFILE(CHRTRAN(FILETOSTR("g:\temp\200903123120igea4033.sed")," ",CHR(13)),"g:\temp\temp8.txt")
CREATE CURSOR sed(n1 c(12))
APPEND FROM g:\temp\temp8.txt SDF && CSV
?SECONDS( )-t1

是不是时间又缩短一半了,只用1.2秒。
vfp的各种函数在不同的环境中,速度差别是很悬殊的!
cbl518 2009-03-23
  • 打赏
  • 举报
回复
我刚才测试了一下:

wwwwb 的代码完全精炼!是我搞错了!

对不起!!!
wwwwb 2009-03-20
  • 打赏
  • 举报
回复
测试了一下cbl518的代码,在VFP9下,结果有问题:
1、在GROUP BY中不能直接用RECN(),否则出错,除第一个字段有内容外,
其它为0,多次实践得出结论;
2、第2、3个IIF少),且在分组中,一般用聚合函数,SUM、MAX等等;
3、建议大家用标准的SQL语句;
4、请cbl518检查一下代码。
wwwwb 2009-03-20
  • 打赏
  • 举报
回复
呵呵,思路基本一致,查询用的时间少,主要在存储TXT文件上了
shanyejunjie 2009-03-19
  • 打赏
  • 举报
回复
cbl518 ,你的方法未通过测试,弹出数据类型不匹配,改为sys(3099,90/80)后,弹出group by无效
加载更多回复(29)

2,727

社区成员

发帖
与我相关
我的任务
社区描述
VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧