我已经开发了一个vba应用程序,该应用程序读取定界的文本文件并将数据加载到Oracle表中。
我成功地用逗号,冒号,分号和竖线分隔符分割了字符串。
相同的代码逻辑不适用于单个或多个空格定界符。
由于我的逻辑不适用于具有分割功能的空间分隔符, 我已经使用了位置参数并对字段长度进行了硬编码。 但这有局限性。需要基于不适当且动态的列数来修改代码。
.1。以空格分隔的文本文件示例。
EMPNO,ENAME,JOB,MGR,HIREDATE,SAL,COMM,DEPTNO
7369 SMITH CLERK 7902 17-DEC-80 800 20
7499 ALLEN SALESMAN 7698 20-FEB-81 1600 300 30
7521 WARD SALESMAN 7698 22-FEB-81 1250 500 30
7566 JONES MANAGER 7839 02-APR-81 2975 20
7654 MARTIN SALESMAN 7698 28-SEP-81 1250 1400 30
.2。用分隔符分割记录的代码::; |
' Load the file.
fnum = FreeFile
Open DataFile For Input As fnum
whole_file = Input$(LOF(fnum), #fnum)
Close fnum
If whole_file <> "" Then
' Break the file into lines
LINES = Split(whole_file, vbCrLf)
' Dimension the array.
num_rows = UBound(LINES)
ReDim Fields_Array(num_rows)
Else
MsgBox "No Rows Are Ported." & vbCrLf _
& "Please Verify Whether The File Is Empty.", vbOKOnly +
vbInformation, "Data Porting Process."
LogName.Write ("No Rows Are Ported. Please verify whether the file is
emply.") & vbCrLf
Exit Sub
End If
' Copy the data into the array.
For R = 0 To num_rows - 1
If cboDelimiter.Value = "Comma" Then
Fields_Array(R) = Split(LINES(R), ",")
ElseIf cboDelimiter.Value = "Colon" Then
Fields_Array(R) = Split(LINES(R), ":")
ElseIf cboDelimiter.Value = "Semi Colon" Then
Fields_Array(R) = Split(LINES(R), ";")
ElseIf cboDelimiter.Value = "Pipe" Then
Fields_Array(R) = Split(LINES(R), "|")
End If
Next R
Rs.AddNew
For C = 0 To UBound(Fields_Array(R))
If Fields_Array(R)(C) = "" Then
Rs.Fields(C) = Null
Else
Rs.Fields(C) = VBA.Trim(Fields_Array(R)(C))
End If
Next C
Rs.Update
用于非动态位置参数的代码
# ' Data Loading Starts here
Set InStream = fsys.OpenTextFile(DataFile, ForReading, False)
Skip1: Do While Not InStream.AtEndOfStream
If Flag Then
DoEvents
FullLine = VBA.Trim(InStream.ReadLine)
If VBA.Trim(FullLine) = "" Then GoTo Skip1
If InStr(1, FullLine, "#", vbTextCompare) = 0 Then
If Rs.Fields.Count = 1 Then
'Table fields assignment
v_F0 = VBA.Trim(Mid(FullLine, 1, 100))
Else
'Table fields assignment
v_F0 = VBA.Trim(Mid(FullLine, 1, 4)) 'Empno4
v_F1 = VBA.Trim(Mid(FullLine, 6, 10)) 'Ename10
v_F2 = VBA.Trim(Mid(FullLine, 17, 9)) 'Job9
v_F3 = VBA.Trim(Mid(FullLine, 27, 4)) 'Mgr4
v_F4 = VBA.Trim(Mid(FullLine, 32, 9)) 'Hiredate9
v_F5 = VBA.Trim(Mid(FullLine, 42, 7)) 'Sal7
v_F6 = VBA.Trim(Mid(FullLine, 50, 7)) 'Comm7
v_F7 = VBA.Trim(Mid(FullLine, 58, 2)) 'Deptno3
End If
我想使用更多动态代码,如下所示 但它与列值不正确匹配。
# ' Copy the data into the array.
For R = 0 To num_rows - 1
If cboDelimiter.Value = "Comma" Then
Fields_Array(R) = Split(LINES(R), ",")
ElseIf cboDelimiter.Value = "Colon" Then
Fields_Array(R) = Split(LINES(R), ":")
ElseIf cboDelimiter.Value = "Semi Colon" Then
Fields_Array(R) = Split(LINES(R), ";")
ElseIf cboDelimiter.Value = "Pipe" Then
Fields_Array(R) = Split(LINES(R), "|")
ElseIf cboDelimiter.Value = "Fixed Length" Then
Fields_Array(R) = Split(LINES(R), " ")
End If
Next R
Rs.AddNew
For C = 0 To UBound(Fields_Array(R))
If Fields_Array(R)(C) = "" Then
Rs.Fields(C) = Null
Else
Rs.Fields(C) = VBA.Trim(Fields_Array(R)(C))
End If
Next C
Rs.Update