用于输出TSV的Excel VBA脚本给出前导和尾随双引号,如何删除它们

Shenanigator:
Sub ExportDataTSV()
Dim BCS As Worksheet
Dim Ctrl As Worksheet
Dim ws As Worksheet
Dim FName As String
Dim insertValues As String

Application.EnableEvents = False
Application.ScreenUpdating = False

Set BCS = ThisWorkbook.Sheets(Sheet2.Name)
Set Ctrl = ThisWorkbook.Sheets(Sheet1.Name)

fileDate = Year(Now) & "_" & Month(Now) & "_" & Day(Now) & "_" & Format(Now, "hh")

#If Mac Then
    NameFolder = "documents folder"

    If Int(Val(Application.Version)) > 14 Then
    'You run Mac Excel 2016
    folder = _
    MacScript("return POSIX path of (path to " & NameFolder & ") as string")
    'Replace line needed for the special folders Home and documents
    folder = _
    Replace(SpecialFolder, "/Library/Containers/com.microsoft.Excel/Data", "")
    Else
    'You run Mac Excel 2011
    folder = MacScript("return (path to " & NameFolder & ") as string")
    End If
    
    FName = folder & ":bcs_output.txt"
#Else
    folder = Environ$("userprofile")
    
    FName = folder & "\Documents\bcs_output_" & fileDate & ".txt"
#End If

If Ctrl.Range("D9") = "" Or Ctrl.Range("D10") = "" Then
    MsgBox "Please enter the Scenario Year and Scenario you wish to save and click again", vbOKOnly
    Exit Sub
End If

Ctrl.Range("D9").Copy
BCS.Range("AS2").PasteSpecial Paste:=xlPasteValues

Ctrl.Range("D10").Copy
BCS.Range("AT2").PasteSpecial Paste:=xlPasteValues

Call ClearFile(FName)

With BCS
    
    .AutoFilter.ShowAllData
    numrows = .Cells(.Rows.Count, 1).End(xlUp).Row
    numcol = .Cells(2, Columns.Count).End(xlToLeft).Column
    .Range("AS1").Value = "scenario_year"
    .Range("AS2:AS" & numrows).FillDown
    .Range("AT1").Value = "scenario"
    .Range("AT2:AT" & numrows).FillDown
    .Range("AU1").Value = "save_date"
    .Range("AU2").Formula = "=NOW()"
    .Range("AU2:AU" & numrows).FillDown
    .Range("AU2:AU" & numrows).NumberFormat = "yyyy-mm-dd hh:mm"
    For x = 2 To numrows
        Set rng1 = .Range("A" & x & ":R" & x)
        Set rng2 = .Range("AC" & x & ":AF" & x)
        Set rng3 = .Range("AH" & x & ":AK" & x)
        Set rng4 = .Range("AN" & x & ":AO" & x)
        Set rng5 = .Range("AS" & x & ":AU" & x)
        Set Data = Union(rng1, rng2, rng3, rng4, rng5)
    
        insertValues = Join2D(ToArray(Data), Chr(9))
        Call ConvertText(FName, insertValues)
    Next x
End With


With BCS
    .Activate
    .Range("A1").Select
End With

Ctrl.Activate
Application.ScreenUpdating = True

MsgBox "Cluster Data saved to " & FName & ", please upload the file here: https://awsfinbi.corp.amazon.com/s/dcgs_abv/submit", vbOKOnly
Application.EnableEvents = True
End Sub

Function ToArray(rng) As Variant()
    Dim arr() As Variant, r As Long, nr As Long
    Dim ar As Range, c As Range, cnum As Long, rnum As Long
    Dim col As Range

    nr = rng.Areas(1).Rows.Count
    ReDim arr(1 To nr, 1 To rng.Cells.Count / nr)
    cnum = 0
    For Each ar In rng.Areas
        For Each col In ar.Columns
        cnum = cnum + 1
        rnum = 1
        For Each c In col.Cells
            arr(rnum, cnum) = c.Value
            rnum = rnum + 1
        Next c
        Next col
    Next ar

    ToArray = arr
End Function

Public Function Join2D(ByVal vArray As Variant, Optional ByVal sWordDelim As String = " ", Optional ByVal sLineDelim As String = vbNewLine) As String
    
    Dim i As Long, j As Long
    Dim aReturn() As String
    Dim aLine() As String
    
    ReDim aReturn(LBound(vArray, 1) To UBound(vArray, 1))
    ReDim aLine(LBound(vArray, 2) To UBound(vArray, 2))
    
    For i = LBound(vArray, 1) To UBound(vArray, 1)
        For j = LBound(vArray, 2) To UBound(vArray, 2)
            'Put the current line into a 1d array
            aLine(j) = vArray(i, j)
        Next j
        'Join the current line into a 1d array
        aReturn(i) = Join(aLine, sWordDelim)
    Next i
    
    Join2D = Join(aReturn, sLineDelim)
    
End Function

Public Function ClearFile(myfile)

Open myfile For Output As #1: Close #1

End Function
Public Function ConvertText(myfile As String, strTxt As String)

Open myfile For Append As #1
Write #1, strTxt
Close #1

End Function

以上功能是我从各种SO post和google中串连而成的。它在很大程度上起作用,但是当它使用制表符分隔符创建txt文件时,会给出输出,其中文本分隔符中是单引号。但是,整行用双引号引起来。所以输出看起来像"'Field1'\t'Field2'\t'Field3'"由于双引号,这不是用于加载到Redshift这样的数据库中的有效TSV格式。我需要双引号不要出现在文件中,有人可以确定为什么要添加双引号吗?有没有一种方法可以防止这种情况,或者有更好的方法来创建制表符分隔的文件输出以加载到Redshift?

有关更多信息,它必须是带有制表符分隔符的txt,我无法控制该要求。

蒂姆·威廉姆斯(Tim Williams):

https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/writestatement

与Print#语句不同,Write#语句在将项目和字符串写到文件中时在字符串之间将逗号和引号引起来您不必在列表中放置明确的定界符。在将outputlist中的最后一个字符写入文件后,Write#插入一个换行符,即回车换行符(Chr(13)+ Chr(10))。

要不添加引号,请切换至Print

Print #1, strTxt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在AWK脚本输出中的字段周围添加双引号吗?

删除前导和尾随空格?

如何在jq输出中删除双引号以解析bash中的json文件?

处理列表列时,如何使用to_tsv()将单引号切换为双引号?

如何像tsv一样从python保存输出

通过VBA包含双引号的Excel公式

如何仅使用Excel公式删除单词之间的空格,而只删除前导和尾随空格?

Excel Vba:公式中的双引号?

python字符串条不适用于尾随双引号

如何从XSLT参数输出双引号?

如何用双引号管道输出

如何修剪某些输出的每一行的前导和尾随空格?

在Excel中使用双引号和if条件

在Excel 2010中打开文件时,如何在csv文件中保存双引号和分号?

错误#VALUE,VBA中UDF中的长字符串用于Excel中的输出

访问excel vba双引号问题

如何使用Shell脚本从文件的每一行中删除前导和尾随空格?

如何从列表输出中删除逗号和引号

QTextEdit用于输入和输出

删除前导和尾随 NA

repr() 没有前导和尾随引号?

Excel 到 .tsv 文件,但仍然有逗号和引号

删除前导和尾随逗号

如何使用Java准备要在Excel中导入的双引号,制表符和双引号的.txt

.reduce() 为对象的值创建双引号如何删除它们?

在大型 Excel 工作簿中删除前导和尾随空格的最佳方法

(PowerShell) 如何从 JSON 输出中删除双引号?

如何删除 csvwriter 输出周围的引号和括号

python代码中的错误输出用于搜索和计算excel中扫描的条形码