Phần này xin trình bày các kỹ thuật đọc các cấu trúc file text mà chúng tôi thường sử dụng. Phương pháp đơn giản nhất là sử dụng các lệnh Line Input để đọc từng dòng, sau đó sử dụng hàm split để tách dòng đó thành mảng các chuỗi ký tự.
Trong đoạn chương trình ví d ụ sau, chúng tôi ti ến hành đọc các thông s ố tọa độ của các Joint của hệ kết cấu trong file s2k của SAP2000 v8.
- Chương trình sẽ lần lượt đọc từng dòng của file s2k cho đến khi gặp dòng [TABLE: "JOINT COORDINATES"]
- Sau đó chương trình tiếp tục đọc từng dòng cho đến khi gặp dòng trống, với mỗi dòng vì dữ liệu được ghi theo t ừng cặp <Tên trường>=<Giá trị> nên chúng tôi s ử dụng hàm DocFile(s As String) để đọc từng cặp này.
- Hàm DocFile phân tích xâu ký t ự s thành nhiều cặp giá trị (sử dụng hàm split), với mỗi cặp giá trị lại sử dụng hàm split tách thành <Tên tr ường> và <Giá trị>, sau đó cặp dữ liệu này được đưa vào một Collection để xử lý.
Option Explicit
' Cấu trúc xâu s: " a=b c=d e=f... " ' Trả về Collection DocFile với
' DocFile(a) = b ' DocFile(c) = d ' DocFile(e) = f
Private Function DocFile(s As String) As Collection
Dim i As Integer
Dim vals As Variant, v2 As Variant
Set DocFile = New Collection ' Khởi tạo Collection
vals = Split(s, " ") ' Tách xâu s thành mảng
For i = LBound(vals) To UBound(vals)
If vals(i) <> "" Then ' Chỉ xử lý với phần tử không rỗng
v2 = Split(vals(i), "=") ' Tách cặp thành 2 phần
End If
Next End Function
' Ví dụ về dữ liệu '....
'TABLE: "JOINT COORDINATES"
' Joint=1 CoordSys=GLOBAL CoordType=Cartesian XorR=0 Y=0 Z=0 SpecialJt=No GlobalX=0 GlobalY=0 GlobalZ=0
' Joint=2 CoordSys=GLOBAL CoordType=Cartesian XorR=10 Y=0 Z=0 SpecialJt=No GlobalX=10 GlobalY=0 GlobalZ=0
'
'TABLE: "CONNECTIVITY - FRAME"
' Frame=1 JointI=1 JointJ=2 IsCurved=No Length=10 CentroidX=5 CentroidY=0 CentroidZ=0
'....
Private Sub Command1_Click() Dim FileNum As Integer
Dim s As String, val As Collection
Dim x As Double, y As Double, z As Double
FileNum = FreeFile
Open "c:\1.s2k" For Input As #FileNum
Do While Not EOF(FileNum) Line Input #FileNum, s
If s = "TABLE: ""JOINT COORDINATES""" Then
' Dòng nhận biết bảng tọa độ nút
Do While Not EOF(FileNum)
Line Input #FileNum, s ' Đọc dòng kế tiếp
If Trim(s) = "" Then Exit Do ' Dừng nếu gặp dòng trống
Set val = DocFile(s) ' Đọc dữ liệu vào Collection
MsgBox val("GlobalX") & " " & val("GlobalY") & " " & val("GlobalZ") ' Hiển thị các dữ liệu đọc được Loop End If Loop Close FileNum End Sub