Excel 在 csv 导出时添加双引号

Excel 在 csv 导出时添加双引号

我在 Excel 中遇到了奇怪的未知行为。我要导出到 csv 文件的工作表包含 4 列,数据如下:

site.aspx|de|lblChanges.Text|some text that will be used somewhere

现在发生的情况是,如果包含文本的最后一列中有双引号,Excel 会为其中已有的每个双引号添加另一个双引号。

例子:

site.aspx|de|lblChanges.Text|some text that will used somewhere <a href="/clickety.aspx">here</a>

转变为

site.aspx|de|lblChanges.Text|"some text that will used somewhere <a href="/clickety.aspx">here</a>"

请注意开头和结尾的额外双引号,这显然不应该出现在那里。这些数据被插入到数据库中并用作全球化的文本资源。如果我使用这些额外的双引号呈现文字控件,功能就会中断。

我怎样才能抑制 Excel 中的这种行为?

答案1

当字段包含空格时,引号是 CSV 的标准(如您的情况)。

通常情况下,您会用引号编写所有 CSV(并使用两个引号对要保留的引号进行转义""):

"field 1", "field 2", "field with ""escaped"" quotes"

以下是完整的解释,其中包括对 Excel 处理的具体引用: http://www.csvreader.com/csv_format.php

但是,如果您无法控制 Excel 导出,也无法控制导入程序,那么可能很难获得想要的结果。您可能不得不在过程中调整文本文件。

答案2

这是有据可查的,而且实际上是预期的行为。但是,绕过它似乎很棘手,我能想到的只有解决方法。

解决方法似乎是打开导出的文件,然后查找并替换引号中的空内容(以删除引号)。

如果您需要更多控制(例如,您可能在某些情况下需要引号),那么您必须手动执行此操作,或对其进行破解 - 在您希望“存在”的位置添加一个唯一的关键字(例如不使用“而是使用 qwertquote(因为这个字符串将是唯一的,您可以找到它并用引号替换它)或者,编写一个实用程序应用程序来为您完成此操作,因为您有编程经验。

有一些代码来自http://www.mcgimpsey.com/excel/textfiles.html#csvwithquotes

未经修改的文本文件

此宏将输出一个文本文件,其中不包含引号中的逗号或文本中的双引号:

Public Sub TextNoModification()
    Const DELIMITER As String = "," 'or "|", vbTab, etc. 
    Dim myRecord As Range
    Dim myField As Range
    Dim nFileNum As Long
    Dim sOut As String
    
    nFileNum = FreeFile
    Open "Test.txt" For Output As #nFileNum
    For Each myRecord In Range("A1:A" & _
            Range("A" & Rows.Count).End(xlUp).Row)
        With myRecord
            For Each myField In Range(.Cells(1), _
                    Cells(.Row, Columns.Count).End(xlToLeft))
                sOut = sOut & DELIMITER & myField.Text
            Next myField
            Print #nFileNum, Mid(sOut, 2)
            sOut = Empty
        End With
    Next myRecord
    Close #nFileNum
End Sub

答案3

来自维基百科:http://en.wikipedia.org/wiki/Comma-separated_values

嵌入逗号或双引号字符的字段必须用引号引起来。

1997 年,福特,E350,“超级豪华卡车”

每个嵌入的双引号字符必须由一对双引号字符表示。

1997 年,福特,E350,“超级、豪华”卡车

所以一个 csv 文件需求这些双引号需要转义(通过使用另一组双引号),因为双引号本身表示字段的边界。

相关内容