读书人

VB怎么读大的文本文件

发布时间: 2012-02-21 16:26:23 作者: rapoo

VB如何读大的文本文件?
Dim strFileString As String
Dim lFileLen1 As Long
Dim strFile as string

strFile= "C:\big.txt "

lFileLen1 = FileLen(strFile) //7168226

Open strFile For Input As #1
Input #1, strFileString
Close #1
lFileLen1 = Len(strFileString) //只能读出5858740

 请问这怎么样才能全部读到内存字符串中? 谢谢!

[解决办法]
Dim MyString, MyNumber
Open "TESTFILE " For Input As #1 ' Open file for input.
Do While Not EOF(1) ' Loop until end of file.
Input #1, MyString, MyNumber ' Read data into two variables.
Debug.Print MyString, MyNumber ' Print data to the Immediate window.
Loop
Close #1 ' Close file.

[解决办法]
分行读
Dim S as string
Open "TESTFILE " For Input As #1
Do While Not EOF(1)
line #1, s
Loop
Close #1
[解决办法]
'返回以行数组表示的文本文件内容。tStrings()的每个元素是文本的一行。默认间隔符号是换行。
Dim tStrings() As String
tStrings()=StringsByFile(tFileName)

如果你的每个记录是以 "? "间隔,则这样读:

Dim tStrings() As String
tStrings()=StringsByFile(tFileName, "? ")


'返回以String表示的文本文件内容(包括换行符)。tText包含了文本当中所有内容(含换行符号)
Dim tText As String
tText=TextGetByFile(tFileName)

下面的函数有依存关系,必须同时存在。

Public Function StringsByFile(ByVal tFileName As String, Optional ByVal pDelimiter As String = vbCrLf) As String()

Dim tOutStrings() As String

Dim tText As String

tText = TextGetByFile(tFileName)

tOutStrings() = Split(tText, pDelimiter)

StringsByFile = tOutStrings()
End Function

Public Function TextGetByFile(ByVal tFileName As String) As String
Dim tOutText As String

Dim tBytes() As Byte

tBytes() = BytesGetByFile(tFileName)

tOutText = StrConv(tBytes(), vbUnicode)

TextGetByFile = tOutText
End Function

Public Function BytesGetByFile(ByVal tFileName As String, Optional ByVal pFileStart As Long = 1) As Byte()
Dim tOutBytes() As Byte
Dim tOutBytes_Length As Long

Dim tFileNumber As Integer
Dim tFileSize As Long

tFileNumber = FreeFile

Open tFileName For Binary As #tFileNumber

tFileSize = LOF(tFileNumber)

tOutBytes_Length = tFileSize - pFileStart

ReDim tOutBytes(tOutBytes_Length)

Get #tFileNumber, pFileStart, tOutBytes()

Close #tFileNumber

BytesGetByFile = tOutBytes()
End Function

[解决办法]
顺便解释一下我上面函数的原理:

1、BytesGetByFile函数以二进制方式获得文本文件的Byte数组。

2、TextGetByFile函数用StrConv函数将以ANSI格式存储的文本文件Byte数组转换为Unicode格式的String。得到文本文件的全部文本内容,并以一个String返回。

3、StringsByFile函数以Split函数根据你定义的分隔符(默认是换行vbCrLf,你需要的是 "? "),根据分隔符将String分割为String数组。

上述函数可以处理不大于2GB的文本文件。

[解决办法]
Dim Fn As String


fNum = FreeFile
Fn = yourfilename
If Dir(Fn) = " " Then
Exit Sub
End If
Dim b() As Byte
Open Fn For Binary As #fNum
ReDim b(LOF(fNum) - 1)
Get #fNum, , b
Close #fNum
dim FileContent as string '文本文件内容
filecontent=StrConv(b(), vbUnicode)
[解决办法]
很久没见 小仙妹 在技术版回贴了,楼主真有面子。:-)
[解决办法]
楼上的应该测试一下 KiteGirl 的代码,我相信效率应该是相当地高。
KiteGirl 的代码一直是精品,很注意算法和效率。:-)
[解决办法]
FileLen(strFile) //7168226
Len(strFileString) //只能读出5858740
================================================
关于这个问题的起因可能是这样的:
1、对于通常的GBK格式的中文文本文件,每个半角字符字符占用1个Byte,每个全角字符占用2个Byte。通常的简体中文文本采用GBK(兼容GB2312)编码。

2、Len函数取的是字符数,它将占用2个字节的全角字符只当作一个字符看待。因此,如果文本包含全角字符(比如汉字),你得到的字符数量必然少于文件字节数。LenB可以得到真实的字节数。

3、VB内部的字符串采用UniCode,UniCode无论半角、全角都占用2个字符。无论简体、繁体,UniCode下的汉字采用UniCode编码,与GBK、BIG5不同。文本文件读入、写入的时候,对UniCode和对应地区的编码进行转换。
我在上面的二进制方式下读取文本文件代码中,有一个函数就是用StrConv将Bytes数组转换为UniCode编码的字符串。如果直接将文本文件的Byte数组拷贝成字符串,将无法正确显示。
同理,用LenB取VB的字符串是不能得到真实文件格式的文本字节长度,因为这个时候文本已经是UniCode编码的。需要将文本转换为GBK(针对于大陆地区)之后才可以得到真实字节数。具体代码如下:

strFileStringGBK=StrConv(strFileString,vbFromUnicode) '简体中文操作系统默认情况转换为GBK。
lFileLen1=LenB(strFileStringGBK) '检索strFileStringANSI的真实字节数。

4、目前对于简体中文而言,常用编码有GBK、UniCode、UTF-8。传统文本文件采用ANSI与GBK存储,这也是最常见的文本格式。随着操作系统的改进,编码格式也在发展。现在有些文本文件采用的是UniCode或UTF-8。我上述的代码对于UniCode和UTF-8是不适用的。

UniCode编码的文本只要稍微修改一下代码就可以,读起来比正常的文本文件还快。

UTF-8就要选用专门的API函数或者第三方控件了。我曾经打算用VB写UTF-8到UniCode的转换函数,但一直没动手去做。人太懒,没办法。

[解决办法]
很正常,FileLen 取得的是 DBCS String 的字节数(不是字符数),Len 取得的是 Unicode String 的字符数。
在 DBCS 中,ASCII 字符的长度是一个字节,而日语、朝鲜语和其它东亚字符的长度是 2 个字节。
在 Unicode 中,所有字符占用 2 个字节,你用 LenB(strFileString) 就会得到11717480。

还有一次性读取用文本方式不如用二进制方式快,如下修改,多用点内存但是速度很快。
Dim strFileString As String
Dim lFileLen1 As Long
Dim strFile as string
dim aBuffer() as byte

strFile= "C:\big.txt "

lFileLen1 = FileLen(strFile) //7168226
Redim aBuffer(lFileLen1 - 1)

Open strFile For Binary Access Read As #1
Get #1, 1, aBuffer
Close #1
strFile = strconv(abuffer, vbunicode)
lFileLen1 = Len(strFileString) //只能读出5858740
[解决办法]
Sub aa()
Dim MyGet() As String
Dim P As Long
Dim Position As Long
Dim Flength As Long
Dim size As Long


Open "TESTFILE " For Input As #1
Flength = LOF(1)
Position = 0
size = 32768 '一次读32K

Do While Position < Flength
If Flength - Position < size Then size = Flength - Position

P = P + 1
ReDim Preserve MyGet(0 To P)
Get #1, Position + 1, MyGet(P)
Debug.Print MyGet(P)
Position = Position + size

Loop
Close #1
End Sub
这个不知道行不行

读书人网 >VB

热点推荐