将带有多行文本的推文导出为CSV
将带有多行文本的推文导出为CSV
我需要生成一个Excel文件,其中一些值包含多行。
其中还包含非英文文本,因此文件必须是Unicode。
我现在生成的文件看起来像这样:(使用UTF8编码,混合了非英文文本,并且有很多行)
Header1,Header2,Header3 Value1,Value2,"Value3 Line1 Value3 Line2"
请注意,多行值用双引号括起来,其中包含普通的每行末尾换行符。
根据我在网上找到的信息,这应该可以工作,但是它不行,至少在Excel 2007和UTF8文件中,Excel将第三行视为数据的第二行,而不是第一个数据行的第二行。
这必须在我的客户机器上运行,我无法控制他们的Excel版本,因此我需要一个可以在Excel 2000及更高版本上工作的解决方案。
谢谢
编辑:我通过拥有两个CSV选项(一个用于Excel(Unicode、制表符分隔、字段中没有换行符),另一个用于世界其他地方(UTF8、标准CSV))“解决”了我的问题。
虽然不是我想要的,但至少它可以工作(到目前为止)
经过多次调整,这里有一个可以在Linux上生成文件,在Windows上使用Excel读取的配置,尽管嵌入的换行格式不符合标准:
- 字段内部的换行符需要使用\n(并且很明显需要在双引号中引用)
- 记录结束:\r\n
- 确保你不要以等于号开头的字段,否则它会被当作公式处理并截断
在Perl中,我使用Text::CSV来完成这个过程,代码如下:
use Text::CSV; open my $FO, ">:encoding(utf8)", $filename or die "Cannot create $filename: $!"; my $csv = Text::CSV->new({ binary => 1, eol => "\r\n" }); #for each row...: $csv -> print ($FO, \@row);
只有在空格字符是数据的一部分时,才应在字段开头添加空格字符。Excel不会去除前导空格。你会在标题和数据字段中得到不需要的空格。更糟的是,应该“保护”第三列换行符的"
将被忽略,因为它不在字段的开头。
如果文件中有非ASCII字符(编码为UTF-8),则应在文件开头加入UTF-8 BOM(3个字节,hex EF BB BF
)。否则,Excel将根据您所在地区的默认编码(例如cp1252)解释数据,而不是UTF-8,导致您的非ASCII字符被破坏。
以下注释适用于Excel 2003、2007和2013;未在Excel 2000上测试过
如果您在Windows Explorer中双击文件名打开文件,则一切正常。
如果您在Excel中打开它,则结果各不相同:
- 文件中只有ASCII字符(没有BOM):可以工作。
- 文件中有非ASCII字符(编码为UTF-8),并在开头有一个UTF-8 BOM:它识别数据是以UTF-8编码的,但它忽略了csv扩展名,并将您丢入了不是向导的文本导入,不幸的是,结果是您会遇到换行符的问题。
选项包括:
- 训练用户不从Excel中打开文件:-(
- 考虑直接编写XLS文件...在Python/Perl/PHP/.NET等中有可用的库和包。