导出到不带引号的管道分隔 .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
...除了两个问题:
竖线分隔符问题:我无法更改竖线“|”的逗号“,”分隔符改变下面的语法。此语法可能只保留给逗号分隔的文件。你会推荐什么?
If j = rng.Columns.Count Then
Write #1, cellValue Else
Write #1, cellValue,
不必要的引号:在上面提供的相同位中,我使用 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
我创建了一个 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
...除了两个问题:
竖线分隔符问题:我无法更改竖线“|”的逗号“,”分隔符改变下面的语法。此语法可能只保留给逗号分隔的文件。你会推荐什么?
If j = rng.Columns.Count Then Write #1, cellValue Else Write #1, cellValue,
不必要的引号:在上面提供的相同位中,我使用 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