サイズ230MBのテキストファイルがあります。そのファイルの行数を数えたい。
「」を試しScripting.FileSystemOblect
ましたが、メモリ不足になります。
助けてください。
ありがとう。
通常のWindowsの改行はCRLFであるため、ファイルの最後の行の後にLFがない場合は、LFをカウントし、カウントに1を加算できます。
真のVB(つまり、VB5、VB6など)では、バイト指向の文字列操作を利用して、多くのタスクを高速化できます。テキストファイルにANSIが含まれていると想定できる場合、これは非常に高速です。
Option Explicit
Private Sub Main()
Const BUFSIZE As Long = 100000
Dim T0 As Single
Dim LfAnsi As String
Dim F As Integer
Dim FileBytes As Long
Dim BytesLeft As Long
Dim Buffer() As Byte
Dim strBuffer As String
Dim BufPos As Long
Dim LineCount As Long
T0 = Timer()
LfAnsi = StrConv(vbLf, vbFromUnicode)
F = FreeFile(0)
Open "big.txt" For Binary Access Read As #F
FileBytes = LOF(F)
ReDim Buffer(BUFSIZE - 1)
BytesLeft = FileBytes
Do Until BytesLeft = 0
If BufPos = 0 Then
If BytesLeft < BUFSIZE Then ReDim Buffer(BytesLeft - 1)
Get #F, , Buffer
strBuffer = Buffer 'Binary copy of bytes.
BytesLeft = BytesLeft - LenB(strBuffer)
BufPos = 1
End If
Do Until BufPos = 0
BufPos = InStrB(BufPos, strBuffer, LfAnsi)
If BufPos > 0 Then
LineCount = LineCount + 1
BufPos = BufPos + 1
End If
Loop
Loop
Close #F
'Add 1 to LineCount if last line of your files do not
'have a trailing CrLf.
MsgBox "Counted " & Format$(LineCount, "#,##0") & " lines in" & vbNewLine _
& Format$(FileBytes, "#,##0") & " bytes of text." & vbNewLine _
& Format$(Timer() - T0, "0.0#") & " seconds."
End Sub
293MBの7,000,000行のファイルを考えると、ここではわずか0.7秒しかかかりません。ただし、そのテストを実行したときにファイルがキャッシュされていないことを確認するために再起動しなかったことに注意してください。キャッシュを使用しない場合(つまり、再起動後)は、その5倍の時間がかかると思います。
Unicodeテキストファイルを処理するための変換は非常に簡単です。B関数をB以外の同等の関数に置き換え、BUFSIZEを2の倍数に設定していることを確認し、ANSILFvbLf
バイトの代わりに検索してください。
各行を同じ変数に読み込むことでそれを行うことができます。すべての行を保存する必要はありません。
dim s as string
dim n as integer
open "filename.txt" for input as 1
n = 0
do while not eof(1)
line input #1, s
n = n + 1
loop
これはテストされておらず、VB6を実行してからしばらく経ちますが、近いはずです。
これは、1mil + 0xD(vbcr)の480mbバイナリファイルで約6秒かかります
Dim buff() As Byte
Dim hF As Integer
Dim i As Long, n As Long
hF = FreeFile(0)
Open "c:\windows\Installer\2f91fd.msp" For Binary Access Read As #hF
ReDim buff(LOF(hF) - 1)
Get #hF, , buff()
Close #hF
For i = 0 To UBound(buff)
If buff(i) = 13 Then n = n + 1
Next
MsgBox n