vb 读取 TXT 第一行,并删除第一行解决方案

vb 读取 TXT 第一行,并删除第一行如题:vb 读取 wangzhi.txt 第一行 到 变量url中,并删除wangzhi.txt第一行

vb 读取 TXT 第一行,并删除第一行
如题:vb 读取 wangzhi.txt 第一行 到 变量url中,并删除wangzhi.txt第一行的内容,其他行不变。

首先我这个TXT文件有几十M。很多循环每一行的代码都不现实。
希望能有一个高效处理的代码。

[解决办法]
通过richtextbox的 load和savetofile方法 速度应该很快
[解决办法]
将这写数据读入一个数组中?
[解决办法]
只有几行代码:

VB code
Option ExplicitPrivate Sub Command1_Click()    Dim FileNumber As Integer, URL As String, i As Long    Dim FileByte() As Byte, sFile() As String        FileNumber = FreeFile    Open "c:\wangzhi.txt" For Binary As #FileNumber    ReDim FileByte(LOF(FileNumber) - 1)    Get #FileNumber, , FileByte    sFile = Split(StrConv(FileByte, vbUnicode), vbCrLf)        URL = sFile(0) '取得文件第一行        Close #FileNumber            '将其他行写入文件中    FileNumber = FreeFile    Open "c:\wangzhi1.txt" For Binary As #FileNumber    For i = 1 To UBound(sFile)        Put #FileNumber, , sFile(i) & vbCrLf    Next    Close #FileNumber    End Sub
[解决办法]
问题就在于删除第一行。

对一个磁盘文件的修改,实际上是重建一个文件。

Dim strLine1 As String
Dim bytData() As Byte
Dim i As Long, n As Long, lngLength As Long

Open "test.txt" For Input As #1
Line Input #1, strLine1
Close #1

i = LenB(StrConv(strLine1, vbFromUnicode)) + 3

Open "test.txt" For Binary As #1
lngLength = LOF(1) - i
Seek #1, i

Open "new_test.txt" For Binary As #2

Do While lngLength

If lngLength > 65536 Then
n = 65536
lngLength = lngLength - 65536
Else
n = lngLength
End If

ReDim bytData(n - 1)

Get #1, , bytData
Put #2, , bytData

lngLength = lngLength - n

Loop

Close #2
Close #1

Kill "test.txt"
Name "new_test.txt" As "test.txt"
[解决办法]

楼主,你看仔细了,6 楼的代码是 64K 缓存下的循环(当然,如果你的内存够大,还可以更大)。

另外,你把磁盘文件的读写编辑的原理搞搞清楚,再考虑 shell 还是其他语句。
[解决办法]
要高效就要重新考虑方案:
循环将所有行都处理了,然后直接删除文件。
如果数据是不停增长的,考虑将一个文件分为多个文件 wangzhi001.txt wangzhi002.txt ...
[解决办法]

楼主的需求是明确的,一个几十兆的文件,先读出第一行,然后删除此行。不想用 Line Input 循环读取所有行的方式来生成新文件,因为太慢。


[解决办法]
可以这样考虑:除第一行外,将剩下的字节按照4096的倍数写入新文件。这样应该要快一些,减少了循环次数。
[解决办法]
怎么感觉相似做发送邮件或者扫号的,处理完一个就删除一个。 你就每次重新保存吧,速度也慢不了哪去。
[解决办法]

如果楼主所述的过程将对一个文件反复进行的话,这个方案就不大好。似乎更适于采用数据库。
[解决办法]
探讨

只有几行代码:
VB code
Option Explicit

Private Sub Command1_Click()
Dim FileNumber As Integer, URL As String, i As Long
Dim FileByte() As Byte, sFile() As String

FileNumber = FreeFile
……

[解决办法]
要想高效,除非用数据库
[解决办法]
探讨
我这个TXT文件有几十M。很多循环每一行的代码都不现实。
希望能有一个高效处理的代码。

------解决方案--------------------


不用循环还是很快的。VB的Get语句本身就有从指定字节处获取字节的功能。
根据这一点,在我的电脑上测试了一个85.3M的文本文件(每行末尾均有一回车换行符),从指定字节处读取以后的所有字节时间是:1.75秒,然后将字节数组整体写入新文件中时间是:6.891秒。已经很快了!我的电脑是:技嘉8irx CPU是:Intel(R) Pentium(R) 4 CPU 1.60GHz,10年前的电脑了。大家可以测试一下!

VB code
Option ExplicitPrivate Declare Function GetTickCount Lib "kernel32.dll" () As LongDim st1 As Long, st2 As Long, et1 As Long, et2 As LongPrivate Sub Command1_Click()    Dim FileNumber As Integer, URL As String, i As Long    Dim FileByte() As Byte, sFile() As String        FileNumber = FreeFile    Open "c:\wangzhi.txt" For Binary As #FileNumber    Line Input #FileNumber, URL '取得文件第一行    Close #FileNumber        Debug.Print "url=" & URL        i = LenB(StrConv(URL & vbCrLf, vbFromUnicode)) '第一行字节数        '获取第一行以后的其他行,并保存到字节数组FileByte中    st1 = GetTickCount    FileNumber = FreeFile    Open "c:\wangzhi.txt" For Binary As #FileNumber    Erase FileByte    ReDim FileByte(LOF(FileNumber) - 1 - i)    Get #FileNumber, i + 1, FileByte    Close #FileNumber    et1 = GetTickCount            st2 = GetTickCount    '将其他行写入文件中    FileNumber = FreeFile    Open "c:\wangzhi1.txt" For Binary As #FileNumber    'For i = 1 To UBound(sFile)        Put #FileNumber, , FileByte    'Next    Close #FileNumber    et2 = GetTickCount        Debug.Print "读出内容时间:" & (et1 - st1) / 1000 & "秒", "写入内容时间:" & (et2 - st2) / 1000 & "秒"    End Sub