导出到不带引号的管道分隔 .txt 文件

Export to pipe delimited .txt file without quotes

我创建了一个 VBA 代码,可将数据从单个硬编码工作表导出到 export.txt 文件。我不得不使用两个 For 循环,因为我不知道以什么不同(和简单)的方式我会跳过从导出角度来看由不必要信息组成的两行(文件类型和另一个宏的主键)。尽管如此,宏还是发挥了它的作用...

Sub VBA_Write_to_a_text_file()
Dim filename As String
Dim rng As Range
Dim cellValue As Variant
Dim i As Integer
Dim j As Integer

filename = Application.ThisWorkbook.Path & "/export.txt"
Open filename For Output As #1

Set rng = Sheets(22).Range("A1:G1")
For i = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
        cellValue = rng.Cells(i, j).Value
            If j = rng.Columns.Count Then
            Write #1, cellValue
        Else
            Write #1, cellValue,
        End If
    Next j
Next i

Set rng = Sheets(22).Range("A4:G18")
For i = 1 To rng.Rows.Count
    For j = 1 To rng.Columns.Count
        cellValue = rng.Cells(i, j).Value
            If j = rng.Columns.Count Then
            Write #1, cellValue
        Else
            Write #1, cellValue,
        End If
    Next j
Next i

Close #1
End Sub

...除了两个问题:

  1. 竖线分隔符问题:我无法更改竖线“|”的逗号“,”分隔符改变下面的语法。此语法可能只保留给逗号分隔的文件。你会推荐什么?

    If j = rng.Columns.Count Then
    Write #1, cellValue Else
    Write #1, cellValue,
    
  2. 不必要的引号:在上面提供的相同位中,我使用 Write 而不是 Print。我知道 Print 会去掉引号,但它也会删除分隔符,生成一个制表符分隔的文件,这不是一个选项。管道问题比引号问题更重要,但理想情况下我的目标是同时解决这两个问题。

提前感谢您的所有建议。

示例源数据:

使用 FileSystemObject 创建您的文本文件并向其中写入您喜欢的任何内容:

Dim oFso : Set oFso = CreateObject("Scripting.FileSystemObject")
Dim oFile : Set oFile = oFso.CreateTextFile("C:\temp\myfile.txt")

然后您可以使用以下命令编写任何您想要的内容:

oFile.WriteLine "This will write a line and end it with a vbNewLine"
oFile.Write "Where this write method will "
oFile.Write "just write to the file without the new line on the end of the text."
oFile.WriteLine "You|can|send|pipe|delimited|text|or|whatever|else|you|like"
oFile.Close 'close and save the updated text file

您可以根据需要加倍控制是否发送报价,例如:

oFile.WriteLine """This is quoted text"""

将在您的文件中打印 "This is quoted text"。

完全同意 Dave 关于使用 FileSystemObject 的建议 - 它在 Microsoft Scripting Runtime 库中可用,您应该将其添加到您的项目中。我的另一个建议是迭代数据行并为每一行创建一个数组。然后,您可以使用 Join 函数将该数组转换为字符串,每个值都用您选择的分隔符分隔,例如|

Range 的一行转换为一维数组需要使用 Transpose 函数的小技巧。它确实使您不必总是检查最后一个字段并且不在该迭代中输出定界符。它还使您不必使用嵌套循环。

代码如下:

Option Explicit

Sub Export()

    'for file system
    Dim objFs As New FileSystemObject
    Dim tsOut As TextStream

    'for data
    Dim rngHeaders As Range
    Dim rngData As Range
    Dim rngRow As Range
    Dim varRowData As Variant
    Dim strRowData As String
    Dim strDelimiter As String

    'counters
    Dim lngCounter As Long

    'set up data
    Set rngHeaders = Sheet2.Range("A1:F1")
    Set rngData = Sheet2.Range("A3:F10")

    'set delimiter
    strDelimiter = "|"

    'set up file system
    Set tsOut = objFs.CreateTextFile("c:\temp\out.txt", True)

    'output header
    varRowData = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngHeaders.Value))
    strRowData = VBA.Join(varRowData, strDelimiter)
    tsOut.WriteLine strRowData

    'output data
    For lngCounter = 1 To rngData.Rows.Count
        Set rngRow = rngData.Rows(lngCounter)
        varRowData = WorksheetFunction.Transpose(WorksheetFunction.Transpose(rngRow.Value))
        strRowData = VBA.Join(varRowData, strDelimiter)
        tsOut.WriteLine strRowData
    Next lngCounter

    'clean up
    tsOut.Close
    Set tsOut = Nothing
    Set objFs = Nothing

End Sub