ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: XUZHANCHENG

[求助] excel sql无法读取和计算csv文件

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-12-23 09:35 | 显示全部楼层
zhaogang1960 发表于 2015-12-23 00:03
我前面说法有误,不是Open方法,是Open 语句:
Open myPath & MyFile For Input As #1
MyFile 是csv文 ...

就是application.workbooks.open()的语句吗,因为我目前就是用这个。另外,我自己测试了一下,仅仅是打开读取文件中的某个单元格的数据到汇总表这样的操作,当文件有1000个的时候就需要2分多钟,如果要遍历打开的文件的数据,并且要做一些判断的话,时间更长。我目前程序要读取几千个文件,并且都需要遍历和判断,速度相当的慢,而且当操作其他东西的时候程序很容易就中断了。

TA的精华主题

TA的得分主题

发表于 2015-12-23 12:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
jingooluo 发表于 2015-12-23 09:35
就是application.workbooks.open()的语句吗,因为我目前就是用这个。另外,我自己测试了一下,仅仅是打开 ...

workbooks.open是Open 方法,速度比Open 语句慢很多

TA的精华主题

TA的得分主题

发表于 2015-12-23 14:38 | 显示全部楼层
zhaogang1960 发表于 2015-12-23 00:03
我前面说法有误,不是Open方法,是Open 语句:
Open myPath & MyFile For Input As #1
MyFile 是csv文 ...

赵版能详细解释一下open语句吗,我尝试了一下,open语句似乎并不是真正打开文件,但是当再次运行该语句时又提示文件已经打开。不知道怎么引用该文件的内容。另外在循环体中用这个语句打开文件时,其参数filenumber的值是不是要随循环体增加呢,在网上看到这个参数的最大值为511,如果要打开的文件超过511是否就溢出了呢。

TA的精华主题

TA的得分主题

发表于 2015-12-23 14:53 | 显示全部楼层
jingooluo 发表于 2015-12-23 14:38
赵版能详细解释一下open语句吗,我尝试了一下,open语句似乎并不是真正打开文件,但是当再次运行该语句时 ...

原来你说的open是直接打开工作簿,怪不得说慢.其实vba的open方式是以流的方式读取数据.前提是,你要处理的文件是类似于文本文档.如果是xlsx,可以通过解压读取xml文档结构.你所说的已经打开,是因为vba每次使用都会以一个句柄代表占用的文件.好像是#number,你要在适当的时候释放它,让它继续用在下一个文件上.

TA的精华主题

TA的得分主题

发表于 2015-12-23 15:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
excelhomesnake 发表于 2015-12-23 14:53
原来你说的open是直接打开工作簿,怪不得说慢.其实vba的open方式是以流的方式读取数据.前提是,你要处理的 ...

非常感谢你的解答,但是由于我原来一直没有接触过这种处理方式,对你说的还是不明白,举个例子:我的程序要逐个打开2000个csv文件并且读取里面的数据,我按赵版提醒在循环体(遍历所有文件名)中添加“open full_name for input as #i” 语句。然后就不知道要怎么读取相应的数据了,因为文件没有实际打开,不知道怎么引用。另外这个#filenumber要如何释放呢?

TA的精华主题

TA的得分主题

发表于 2015-12-23 15:51 | 显示全部楼层
excelhomesnake 发表于 2015-12-23 14:53
原来你说的open是直接打开工作簿,怪不得说慢.其实vba的open方式是以流的方式读取数据.前提是,你要处理的 ...

以本题目为例,读取多个csv文件:
  1. Sub Open语句()
  2. tt = Timer
  3.     Dim p$, f$, s$(), a, arr(1 To 600000, 0 To 4), i&, j&, m&, n&, v&
  4.     p = ThisWorkbook.Path & ""
  5.     f = Dir(p & "*.csv")
  6.     While f > ""
  7.         v = v + 1
  8.         Open p & f For Input As #1
  9.         s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)
  10.         Close #1
  11.         If v = 1 Then f = 0 Else f = 1
  12.         For i = f To UBound(s) - 1
  13.             m = m + 1
  14.             a = Split(s(i), ",")
  15.             For j = 0 To 3
  16.                 arr(m, j) = a(j)
  17.             Next
  18.         Next
  19.         f = Dir()
  20.     Wend
  21.     Cells.ClearContents
  22.     [a1].Resize(m, 4) = arr
  23.     MsgBox Timer - tt
  24. End Sub

复制代码

TA的精华主题

TA的得分主题

发表于 2015-12-23 15:55 | 显示全部楼层
下面附件中有49个csv文件,有ADO联合查询和Open语句两种代码,后者速度比前者快很多:

Test1.rar (145.2 KB, 下载次数: 74)

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-12-23 16:01 | 显示全部楼层
zhaogang1960 发表于 2015-12-23 15:55
下面附件中有49个csv文件,有ADO联合查询和Open语句两种代码,后者速度比前者快很多:

非常感谢,赶紧收藏了慢慢研究。

TA的精华主题

TA的得分主题

发表于 2015-12-24 11:37 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这么大的数据量,应该考虑用数据库处理,只要是excel动用SQL查询,都要偏历源数据,源数据越大,时间越长,所以自然就慢。

TA的精华主题

TA的得分主题

发表于 2016-1-4 15:24 | 显示全部楼层
zhaogang1960 发表于 2015-12-23 15:55
下面附件中有49个csv文件,有ADO联合查询和Open语句两种代码,后者速度比前者快很多:

赵版你好,我发现用open语句以及s = Split(StrConv(InputB(LOF(1), 1), vbUnicode), vbCrLf)读取数据的时候,有些文件不能读取,同样都是csv文件,格式也都一样,我自己核对过也没发现两个文件有什么不同。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 19:50 , Processed in 0.049294 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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