如何在 Excel 2010 中打开 CSV 文件时保存其中的双引号和分号?

如何在 Excel 2010 中打开 CSV 文件时保存其中的双引号和分号?

我从服务器收到一个 CSV 文件。其中的数据以分号分隔,并且采用 UTF-8 格式。例如,我们收到的数据是:

 "NL 我喜"" mutilple""我喜"

当我们第一次打开它时Excel 2010,它会显示为

NL 我喜" mutilple"我喜

但是当我修改(我只是从上面的文本中删除了字母 L)此文件并使用 excel 将其保存为 CSV 并第二次打开它时,它看起来像

N inbetween我喜(不带双引号)

我想让修改之后的数据用双引号保存。

谢谢

答案1

我尝试使用 excel 2016

我打开了 Excel - 选择文件,打开选择“CSV”文件并选择分隔符,分号作为分隔符和“作为文本分隔符。

然后按预期导入,我可以编辑单元格并按照您的原始问题删除 L

正如您在其他答案中发现和解释的那样,单击“保存”确实会损坏文件。

但是,根据其中一条注释,选择“另存为”并选择“UNICODE” - 该文件被保存为 UTF-8 作为 TAB 分隔文件,并以“作为文本分隔符。您尝试过吗?这不可接受吗?

如果我选择另存为并选择 UTF-8 逗号分隔,则将以 UTF-8 逗号分隔保存 - 我找不到保留分号作为分隔符的方法。但是,您应该查看另存为选项,看看您的 Excel 版本中是否有可用的格式可以接受。

如果必须保留分号,那么您可以对保存的文件进行后期处理,使用理解引用的文本替换脚本(以便引号内的 , 不会被替换)可以编写 VBScript 或 Powershell 脚本来执行此操作,或者可以使用 VBA 宏将所有单元格连接成一个单元格,并用逗号分隔它们。

最终转换所需的单行 Powershell 相关命令是(从 CMD 提示符运行)

powershell -command "& import-csv 'CSVUTF.CSV'| export-csv 'PSCSVUTF.CSV' -Encoding 'UTF8' -Delimiter ';' -notype"

如果您的文件没有带有列名的标题行,则需要提供 -header 参数,并且输出文件将以标题行结束

答案2

似乎几年前 StackOverflow 就回答过这个问题:https://stackoverflow.com/questions/4221176/excel-to-csv-with-utf8-encoding

基本上,excel 仅使用 ASCII 编码保存 CSV。解决方法是使用 OpenOffice、Google Docs 或保存为 UTF8 编码文本。不确定这会如何影响您之后对所操作文件使用的其他进程。

答案3

我编写了一个 VBA 宏,其逻辑是:

  1. double quote如果数据单元格中有,则复制双引号。
  2. 如果数据单元中有comman或,则double quote整个数据用双引号引起来。

例子:

  • 步骤 1:NL 我喜" mutilple"我喜将成为NL 我喜"" mutilple""我喜
  • 步骤2:经过步骤2后,数据将变为"NL 我喜"" mutilple""我喜"

此代码与上述描述相符

tempString = Sheets(1).Cells(lRow, lCol).Text                   ' Get the data from cell.
tempString = Replace(tempString, Chr(34), Chr(34) & Chr(34))    ' If there is double quote, then duplicate it.
CurrTextStr = tempString
pos1 = InStr(tempString, Chr(34))                               ' Get the position of double quote. If not present, it will be 0.
pos2 = InStr(tempString, ";")                                   ' Get the position of semicolon. If not present, it will be 0.
If (pos1 <> 0 Or pos2 <> 0) Then                                ' If there is any double quote or semicolon, then the whole data
    CurrTextStr = Chr(34) & tempString & Chr(34)                '       should be enclosed with double quotes.
End If
oAdoS.WriteText (";" & CurrTextStr)

相关内容