2

サイズ230MBのテキストファイルがあります。そのファイルの行数を数えたい。

「」を試しScripting.FileSystemOblectましたが、メモリ不足になります。

助けてください。

ありがとう。

4

3 に答える 3

7

通常の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バイトの代わりに検索してください。

于 2012-11-28T14:34:32.087 に答える
2

各行を同じ変数に読み込むことでそれを行うことができます。すべての行を保存する必要はありません。

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を実行してからしばらく経ちますが、近いはずです。

于 2012-11-28T05:57:58.843 に答える
2

これは、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
于 2012-11-28T10:54:11.273 に答える