![如何在 Excel 2010 中打开 CSV 文件时保存其中的双引号和分号?](https://linux22.com/image/1530398/%E5%A6%82%E4%BD%95%E5%9C%A8%20Excel%202010%20%E4%B8%AD%E6%89%93%E5%BC%80%20CSV%20%E6%96%87%E4%BB%B6%E6%97%B6%E4%BF%9D%E5%AD%98%E5%85%B6%E4%B8%AD%E7%9A%84%E5%8F%8C%E5%BC%95%E5%8F%B7%E5%92%8C%E5%88%86%E5%8F%B7%EF%BC%9F.png)
我从服务器收到一个 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 宏,其逻辑是:
double quote
如果数据单元格中有,则复制双引号。- 如果数据单元中有
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)