找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 619|回复: 14

[求助]:用VB读写大数据量文本有什么好方法吗?

[复制链接]
发表于 2005-1-13 11:56:42 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
小弟初学VB和VBA编程,遇到了一个棘手问题,请教各位DX:
我有一个DEM数据集,是文本文件,格式为

第一列     第二列    第三列
X坐标     Y坐标     Z坐标

如:  4532145.153      86121354.560     23.203
            4632145.153      87121354.560     23.203
            ...................................

我想把此文件的格式变一下,如下:

第一列     第二列    第三列    第四列
序号      X坐标     Y坐标     Z坐标

如:   10000   4532145.153      86121354.560     23.203
              10001      4632145.153      87121354.560     23.203
              ...................................
于是就编了VB程序,读入源文件,变格式后再写入新文件,但由于数据量太庞大,源文件有77万行,50多M,运行程序时过慢死机,请教DX们有什么好办法提高效率,快速处理海量数据,谢谢啦..................
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
发表于 2005-1-13 13:54:12 | 显示全部楼层
用数据库处理,找找ADO的相关主题
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-1-13 14:28:57 | 显示全部楼层
最初由 lzh741206 发布
[B]用数据库处理,找找ADO的相关主题 [/B]


谢谢DX ,是不是用数据库效率高呀,连接什么数据库好呢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-13 19:47:55 | 显示全部楼层
几十万的数据量,用Access应该就可以了,如果还不够,就用SqlServer
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-18 17:25:38 | 显示全部楼层
以行读,边读边写,千万不要读完后才写入,内存消耗太大
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-19 21:01:59 | 显示全部楼层
可能是用了“&”运算符,或者是把数据都读入了才处理。
用5楼的方法,应该几分钟就处理完了,另外避免用“&”运算符,试试吧
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-1-25 19:43:39 | 显示全部楼层
我也想知道。用文本文件简单点。若用ACCESS有点麻烦。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

已领礼包: 2个

财富等级: 恭喜发财

发表于 2005-1-26 07:44:08 | 显示全部楼层
一楼是不是想把数据从源文件中读出,编好号后再写入源文件,如果那样的话,会很耗内存。
你可以别建一个文件,从源文件中读一行,写入新文件后再到源文件中读一行,这样的话,应该不会死机。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-1 11:29:27 | 显示全部楼层

请指教

最初由 wtkc 发布
[B]以行读,边读边写,千万不要读完后才写入,内存消耗太大 [/B]

怎样用readline实现读一行写一行,请指教……最好有代码……感谢
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-2-1 13:50:06 | 显示全部楼层
谢谢楼上DX指点,我就是以行读,边读边写,读一行源文件,写一行新文件,用文本文件的readline就是图方便

Open sfilename1 For Input As 1
Open sfilename2 For Output As 2


aaa:  Do While Not EOF(1)
      Line Input #1, nu

      Print #2, head, Mid(nu, 1, 8) & "0" & "0", Mid(nu, 27, 9) & "0" & "0", Str(Round(Val(Mid(nu, 53, 16)), 0)) & "." & "0" & "0" & "0"

Loop

Close #1
Close #2

就是像6楼DX说的用了N多的“&”,可是不用“&”怎么达到我想要的格式呀?
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-1 14:46:15 | 显示全部楼层
最初由 lzh741206 发布
[B]用数据库处理,找找ADO的相关主题 [/B]

请问ADO是什么东西啊,能详细讲讲吗?谢谢!
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-2-2 02:04:06 | 显示全部楼层
我觉得用二进制文件存取较方便:
[xml]

''自定义类型==MyData
Private Type MyData
    pX As Double
    pY As Double
    pZ As Double
End Type

Dim mAllData() As MyData '定义全局动态数组

Function SaveData(ByVal vFile As String) As Boolean
'保存数据
    Dim tmpFreeFile As Integer
    tmpFreeFile = FreeFile
    Open vFile For Binary As tmpFreeFile
    Put #tmpFreeFile, 1, mAllData
    Close tmpFreeFile
    SaveData = True
End Function

Function ReadData(ByVal vFile As String, ByVal vRecordCount As Long) As Boolean
'读取数据"vRecordCount"=记录数
    ReDim mAllData(0 To vRecordCount)
    Dim tmpFreeFile As Integer
    tmpFreeFile = FreeFile
    Open vFile For Binary As tmpFreeFile
    Get #tmpFreeFile, 1, mAllData
    Close tmpFreeFile
    SaveData = True
End Function

[/xml]
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-10 17:20:56 | 显示全部楼层
你把
Print #2, head, Mid(nu, 1, 8) & "0" & "0", Mid(nu, 27, 9) & "0" & "0", Str(Round(Val(Mid(nu, 53, 16)), 0)) & "." & "0" & "0" & "0"
改成
Print #2, head, Mid(nu, 1, 8) & "00", Mid(nu, 27, 9) & "00", Str(Round(Val(Mid(nu, 53, 16)), 0)) & ".000"

速度也会快几倍的。

另外小数点后面加几个零干吗?起什么作用呢?多此一举吧,没有也不会影响计算结果。
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-3-26 23:01:54 | 显示全部楼层
Print #2, head, Mid(nu, 1, 8) & "00", Mid(nu, 27, 9) & "00", Str(Round(Val(Mid(nu, 53, 16)), 0)) & ".000"

Print #2, head, Mid(nu, 1, 8) & "00", Mid(nu, 27, 9) & "00",fomat(Val(Mid(nu, 53, 16)),"#####0.000")
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

发表于 2005-4-13 18:36:28 | 显示全部楼层
可以使用split函数啊
论坛插件加载方法
发帖求助前要善用【论坛搜索】功能,那里可能会有你要找的答案;
如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子标题加上【已解决】;
如何回报帮助你解决问题的坛友,一个好办法就是给对方加【D豆】,加分不会扣除自己的积分,做一个热心并受欢迎的人!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|申请友链|Archiver|手机版|小黑屋|辽公网安备|晓东CAD家园 ( 辽ICP备15016793号 )

GMT+8, 2024-11-23 17:21 , Processed in 0.220187 second(s), 59 queries , Gzip On.

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表