从 DAT 文件的特定位置提取字符串
Extracting a string from a specific position from a DAT file
大家好我是 VBA 编程的新手,但我已经使用 Excel 2 年了,我想构建一个程序,可以从每行的特定位置(pos 15)并将其放入我的工作表中的一个单元格中,听起来很容易,但我需要从包含 22,157,838 条记录的 DAT 存档中提取每一行的每个字符串,我必须将 1,048,575 条记录放在一列上,并且偏移到下一栏的开头,非常感谢任何帮助,这是我的代码:
Sub FirstMACR_ATV()
Dim myFile As String
textline As String
CUENTA As String
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
CUENTA = Mid(textline, 15, 30)
End Sub
谢谢:)
已测试...
Sub FirstMACR_ATV()
Const RECS_PER_COL As Long = 1000000
Dim myFile As String, arr(), i As Long
Dim textline As String, c As Range
ReDim arr(1 To RECS_PER_COL, 1 To 1)
Set c = ThisWorkbook.Sheets("destination").Range("A1")
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
i = i + 1
arr(i, 1) = Mid(textline, 15, 30)
'hit row limit?
If i = RECS_PER_COL Then
c.Resize(RECS_PER_COL, 1).Value = arr 'Dump data
ReDim arr(1 To RECS_PER_COL, 1 To 1)
i = 0
Set c = c.Offset(0, 1) 'move over one column
End If
Loop
Close #1
If i > 0 Then c.Resize(i, 1).Value = arr
End Sub
我的回答与蒂姆威廉姆斯的唯一不同(伟大的思想和我的一样)。我添加了一条 Application.StatusBar
消息,以缓解将不得不等待此处理的可怜人的想法。我也是一次写完所有的数据。
您可能想尝试使用 MAX_ROWS_PER_COLUMN
。 100K 可能比 1000k 表现更好(对于日常使用,处理时间大致相同)。无论如何,316 MB Excel 的文件都不是理想的。我推荐使用数据库。
Sub FirstMACR_ATV()
Dim t As Long: t = Timer
Const MAX_ROWS_PER_COLUMN AS Long = 1000000
Dim r As Long, c As Long
Dim myFile As String, textline As String
Dim results() As Variant
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
r = r + 1
If r > MAX_ROWS_PER_COLUMN Or c = 0 Then
c = c + 1
r = 1
ReDim Preserve results(1 To MAX_ROWS_PER_COLUMN, 1 To c)
End If
If r = 50000 Then Application.StatusBar = "Processing record #" & (r * c) & " " & Round(Timer - t, 2) & " Seconds"
results(r, c) = Mid(textline, 15, 30)
Loop
Close #1
Worksheets("Sheet1").Range("A1").Resize(UBound(results), UBound(results, 2)).Value = results
Debug.Print Round(Timer - t, 2)
End Sub
大家好我是 VBA 编程的新手,但我已经使用 Excel 2 年了,我想构建一个程序,可以从每行的特定位置(pos 15)并将其放入我的工作表中的一个单元格中,听起来很容易,但我需要从包含 22,157,838 条记录的 DAT 存档中提取每一行的每个字符串,我必须将 1,048,575 条记录放在一列上,并且偏移到下一栏的开头,非常感谢任何帮助,这是我的代码:
Sub FirstMACR_ATV()
Dim myFile As String
textline As String
CUENTA As String
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
CUENTA = Mid(textline, 15, 30)
End Sub
谢谢:)
已测试...
Sub FirstMACR_ATV()
Const RECS_PER_COL As Long = 1000000
Dim myFile As String, arr(), i As Long
Dim textline As String, c As Range
ReDim arr(1 To RECS_PER_COL, 1 To 1)
Set c = ThisWorkbook.Sheets("destination").Range("A1")
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
i = i + 1
arr(i, 1) = Mid(textline, 15, 30)
'hit row limit?
If i = RECS_PER_COL Then
c.Resize(RECS_PER_COL, 1).Value = arr 'Dump data
ReDim arr(1 To RECS_PER_COL, 1 To 1)
i = 0
Set c = c.Offset(0, 1) 'move over one column
End If
Loop
Close #1
If i > 0 Then c.Resize(i, 1).Value = arr
End Sub
我的回答与蒂姆威廉姆斯的唯一不同(伟大的思想和我的一样)。我添加了一条 Application.StatusBar
消息,以缓解将不得不等待此处理的可怜人的想法。我也是一次写完所有的数据。
您可能想尝试使用 MAX_ROWS_PER_COLUMN
。 100K 可能比 1000k 表现更好(对于日常使用,处理时间大致相同)。无论如何,316 MB Excel 的文件都不是理想的。我推荐使用数据库。
Sub FirstMACR_ATV()
Dim t As Long: t = Timer
Const MAX_ROWS_PER_COLUMN AS Long = 1000000
Dim r As Long, c As Long
Dim myFile As String, textline As String
Dim results() As Variant
myFile = "C:\Users\s3850630\Desktop\EXPMST.dat"
Open myFile For Input As #1
Do Until EOF(1)
Line Input #1, textline
r = r + 1
If r > MAX_ROWS_PER_COLUMN Or c = 0 Then
c = c + 1
r = 1
ReDim Preserve results(1 To MAX_ROWS_PER_COLUMN, 1 To c)
End If
If r = 50000 Then Application.StatusBar = "Processing record #" & (r * c) & " " & Round(Timer - t, 2) & " Seconds"
results(r, c) = Mid(textline, 15, 30)
Loop
Close #1
Worksheets("Sheet1").Range("A1").Resize(UBound(results), UBound(results, 2)).Value = results
Debug.Print Round(Timer - t, 2)
End Sub