Advertisement

【VBA研究】读取Unix下的文本文件到工作表

阅读量:

iamlaosong

一般情况下,在使用VBA编程时处理文件读取问题时会采用Line Input #fileNo, str这种操作方式来实现对数据的获取。这种方法主要通过以下步骤实现:首先打开指定的文本文档并分配一个输入引用;随后设置该输入引用指向待读取的数据行;最后利用适当的函数提取所需的信息并完成数据处理流程。需要注意的是这一操作方式主要针对的是适用于Windows环境下普通文本文件的操作场景,并非所有类型的特殊格式文档都能直接应用此方法进行处理。为了更直观地理解这一过程可以通过以下代码片段作为参考:

复制代码
 Sub ImpData1()

    
     Dim datFullName As String, rline As String
    
     Dim Arr() As String
    
     Dim row1, i, k As Integer
    
     
    
     datFullName = ThisWorkbook.Path & "\" & Cells(15, "O")    '数据文件名
    
     Open datFullName For Input As #1                          ' 打开文件。
    
     row1 = 2
    
     stName = Cells(2, "P")
    
     Do While Not EOF(1)                'EOF(1)中的1是文件号
    
     Line Input #1, rline
    
     Arr = Split(rline, Chr(9))     'Tab是分隔符
    
     k = UBound(Arr) + 1
    
     For i = 1 To k
    
          Sheets(stName).Cells(row1, i) = Arr(i - 1)
    
     Next i
    
     row1 = row1 + 1
    
     Loop
    
     Close #1
    
     
    
     MsgBox "账单数据导入完毕!", vbOKOnly, "中国邮政EMS"
    
  
    
 End Sub
    
  
    
    
    
    
    AI写代码

但是这种方法无法处理Unix系统的文本文件,原因在于两种系统在换行符处理上有显著差异:在Windows环境下,一个换行操作涉及两个控制字符(即\textbackslash{}CR与\textbackslash{}LF),而在Unix系统中则仅需一个\textbackslash{}CR控制字符即可完成换行操作;实际上这相当于Windows中的软分页功能。

建议使用工具将 Unix 下的文本文件转换为 Windows 下的文档;但更为高效的办法是直接操作 Unix 下的文本文件。借助 FSO 对象来管理这些文件时无需在意它们属于哪个操作系统;ReadLine() 方法能够正确读取两种系统下对应的文档内容。在我们分析某一行的数据时发现其格式属于 Unix 下,并且分隔符采用ASCII码为 01 的字符;相应的代码如下:

复制代码
 '导入银行数据到账单工作表

    
 Sub ImpData()
    
     Dim datFullName As String, rline As String
    
     Dim Arr() As String
    
     Dim row1, i, k As Integer, MaxRow As Long, lineno As Long
    
     Dim fso As Object, ts As Object
    
     'Const ForWriting = 2
    
     
    
     '使用fso时,需要在VBA工程中引入:Microsoft Script Runtime库。
    
     Set fso = CreateObject("Scripting.FileSystemObject")
    
     datFullName = ThisWorkbook.Path & "\" & Cells(7, "O")    '数据文件名,第7行
    
     Set ts = fso.OpenTextFile(datFullName, ForReading, True)
    
     row1 = 2
    
     stName = Cells(2, "P")
    
     With Sheets(stName)
    
     '清除数据
    
     ExcelRowNo = .Cells.Rows.Count
    
     MaxRow = .Range("A" & ExcelRowNo).End(xlUp).Row
    
     .Rows("2:" & MaxRow).ClearContents               '清除行内容,全清用clear
    
     Do While Not ts.AtEndOfStream
    
         rline = ts.ReadLine
    
         Arr = Split(rline, Chr(1))       '分隔符ASCII值为01
    
         k = UBound(Arr) + 1
    
         For i = 1 To k
    
              .Cells(row1, i) = Arr(i - 1)
    
         Next i
    
         row1 = row1 + 1
    
     Loop
    
     ts.Close
    
     End With
    
     
    
     MsgBox "账单数据导入完毕!", vbOKOnly, "中国邮政EMS"
    
  
    
 End Sub
    
    
    
    
    AI写代码

在使用FSO时,请参考下文中的示意图:应用FSO时,在VBA工程中需要导入Microsoft Scripting Runtime库。

参见: VBA 实现 文本文件 的多维度处理 VBA 多种方式 处理 文本文件

全部评论 (0)

还没有任何评论哟~