如何加快读取文本文件(或者csv文件)的速度,谢谢啦

dzpkhas 2007-02-05 06:13:21
老板嫌速度慢,叫我加快读取速度,请各位帮帮忙吧
代码如下,读的是csv文件
Dim sr As System.IO.TextReader
Dim array_line() As String
Dim i As Integer
Dim j As Integer
Dim strLine As String
Try
PsGetData = True

sr = New StreamReader(strPath, System.Text.Encoding.Default)

sr.ReadLine()

'计算行数
i = 1
Do
If sr.Peek() = -1 Then
Exit Do
End If
strLine = sr.ReadLine()
i = i + 1
Loop

sr.Close()

'定义数组
ReDim array(i, int項目数)

'取得数据
sr = New StreamReader(strPath, System.Text.Encoding.Default)
i = 1
Do
array_line = Split(sr.ReadLine(), ",")

For j = 0 To UBound(array_line)
array(i, j + 1) = array_line(j)
Next
If sr.Peek = -1 Then
Exit Do
End If
i = i + 1
Loop
Catch ex As DirectoryNotFoundException
Call cf_MsgScreen(Me, C_ERROR, C_DIRECTORYNOTFOUND)
PsGetData = False
Exit Function
Catch ex As FileNotFoundException
Call cf_MsgScreen(Me, C_ERROR, C_FILENOTFOUND)
PsGetData = False
Exit Function
Catch ex As Exception
Call cf_MsgScreen(Me, C_ERROR, ex.Message)
PsGetData = False
Exit Function
End Try

sr.Close()

PsGetData = True

End Function
代码中,先计算了行数,用来定义数组,然后将数据读进数组,是不适因为使用StreamReader,所以慢呢。
...全文
1393 29 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
29 条回复
切换为时间正序
请发表友善的回复…
发表回复
dzpkhas 2007-02-07
  • 打赏
  • 举报
回复
虽然还是没有解决
dzpkhas 2007-02-07
  • 打赏
  • 举报
回复
感谢各位,结贴
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
可否给一个DataAdapter读取csv的小段代码
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
我尝试了一下,array(1,)=array2(),这样写不可以
viena 2007-02-06
  • 打赏
  • 举报
回复
//如何让2维数组的一行直接等于一个一维数组?
好像可以直接赋值的
viena 2007-02-06
  • 打赏
  • 举报
回复
dataTable?直接把csv文件当数据库打开,DataAdapter.Fill填充数据即可
g555 2007-02-06
  • 打赏
  • 举报
回复
先定义一个很大的数组。
比如:Dim array_line(1000000) As String
只是定义的话,就不占内存。而且字符串不赋值也不占内存
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
老大越说越复杂了,小弟能力不够,如果可以的话,能否给一小段代码,搞定了,小弟再补分
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
多线程应该解决不了问题吧。
另外刚才想了想viena的方法,由于我要以逗号分割,把数组绑定到dataTable中,所以还是要判断逗号,不用Split的话,就要用if,恐怕比Split还要慢把。
另外,如何让2维数组的一行直接等于一个一维数组?比如array(1,)=array2()
viena 2007-02-06
  • 打赏
  • 举报
回复
注意不可用字符串直接连接,同样会使用中间变量
可以用指定合适容量的StringBuilder

或者直接用Substring截取字符串

另外我记得,VB6可以用mid直接操作源字符串,VB.NET中不知道可不可以~
GXY2005 2007-02-06
  • 打赏
  • 举报
回复
这个东西就是这么慢了,可否考虑后台,多线程,表面掩盖下?
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
好的,我去试试,多谢老大指点
viena 2007-02-06
  • 打赏
  • 举报
回复
Split结果是字符串数组,要创建很多的临时字符串,太耗资源
你直接遍历sr.ReadLine(),判断字符,直接复制到数组试一下
viena 2007-02-06
  • 打赏
  • 举报
回复
不是,我说了瓶颈在于Split和随后的逐元素复制
取得行数占不了很多时间的,数组是效率最高的,用arraylist会降低性能
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
看来只有使用arraylist来替代原来的数组,以省去原来为了取得行数而作的循环,老大是这个意思吧
viena 2007-02-06
  • 打赏
  • 举报
回复
其实瓶颈不在读文件上面,在于Split和随后的逐元素复制
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
交错数组就是2个一维数组的嵌套把,这样会提高速度么,不一定把。大家最好帮我出一个直接提高读取速度的方案,比如替代StreamReader
dzpkhas 2007-02-06
  • 打赏
  • 举报
回复
楼上给的代码,我刚才网上也查到了,也是C#的,呵呵。这个方法却是好,貌似问题已经解决,
可惜我在wince下开发,根本没有odbc包,快绝望了,不过还是谢谢各位朋友。
DeanMonica 2007-02-06
  • 打赏
  • 举报
回复
给你一段现成代码,是读到DataSet里的
public DataSet GetDataSetFromCSV(string filePath, string fileName)
{
string strConn = @"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=";
strConn += filePath; //filePath, For example: C:\
strConn += ";Extensions=asc,csv,tab,txt;";
OdbcConnection objConn = new OdbcConnection(strConn);
DataSet dsCSV = new DataSet();
try
{
string strSql = "select * from " + fileName; //fileName, For example: 1.csv
OdbcDataAdapter odbcCSVDataAdapter = new OdbcDataAdapter(strSql, objConn);
odbcCSVDataAdapter.Fill(dsCSV);
return dsCSV;
}
catch (Exception ex)
{
throw ex;
}
}
viena 2007-02-05
  • 打赏
  • 举报
回复
可以把二维数组改为交错数组(即数组的数组)
加载更多回复(9)

16,721

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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