分割由一个或多个空格分隔的字符串

时间:2019-08-16 14:19:29

标签: excel vba

我已经开发了一个vba应用程序,该应用程序读取定界的文本文件并将数据加载到Oracle表中。

  1. 我成功地用逗号,冒号,分号和竖线分隔符分割了字符串。

  2. 相同的代码逻辑不适用于单个或多个空格定界符。

由于我的逻辑不适用于具有分割功能的空间分隔符, 我已经使用了位置参数并对字段长度进行了硬编码。 但这有局限性。需要基于不适当且动态的列数来修改代码。

.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
  1. 用于非动态位置参数的代码

      ' 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

0 个答案:

没有答案