我在 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 文件需求这些双引号需要转义(通过使用另一组双引号),因为双引号本身表示字段的边界。