CSV格式不正确?

4
我正在使用Powershell中的EXPORT-CSV生成一个CSV文件,然后将其提供给Perl脚本。但是,Perl无法导入该文件。
我已经验证了CSV文件与工作版本(从相同的Perl脚本而不是PowerShell导出)之间的差异,并且没有任何区别。列完全相同,它们都使用分号作为分隔符。但是,如果我在Excel中打开文件,则所有内容都将位于每行的第一个单元格中(这意味着我必须使用文本到列)。工作文件从一开始就以不同的单元格结束。
令人困惑的是:当我在记事本中打开文件并将内容复制/粘贴到新文件中时,导入会起作用!
那么,我错过了什么?有我无法在记事本中发现的“隐藏”属性吗?我需要更改编码类型吗?
请帮帮我 :)

你是在使用模块(例如Text::CSV),还是自己解析CSV文件?我强烈建议使用经过充分测试的模块。 - dgw
1
你在Powershell中使用的确切命令是什么?不要只说你在做什么,展示出来。 - manojlds
我正在使用 nConf 软件附带的导入脚本。我相信它是基于 Text::CSV 的。我现在不在我的代码前面,Mano,但我会尽快发布确切命令。谢谢! - Sune
我尝试在PS v2中使用“dir C:\ | export-csv C:\ t.csv”命令,然后用Excel 2010打开它,它会将数据显示在单独的单元格中。 - Andy Arismendi
5个回答

6
为了更好地查看您的CSV文件,请尝试使用Notepad++。这将在状态栏中告诉您文件编码。还要打开隐藏字符(查看>显示符号>显示所有字符)。这将显示是否仅有换行符,或回车+换行符,制表符与空格等... 您还可以从编码菜单中更改文件编码。这可能会帮助您确定差异。记事本不显示任何此类信息。 更新 - 以下是如何在代码中将文本文件从Windows格式转换为Unix格式:
$allText = [IO.File]::ReadAllText("C:\test.csv") -replace "`r`n?", "`n" 
$encoding = New-Object System.Text.ASCIIEncoding    
[IO.File]::WriteAllText("C:\test2.csv", $allText, $encoding)

或者您可以使用Notepad++(编辑 > EOL Conversion > Unix Format)。


这是一个非常好的提示!我按照您的描述打开了文件,果然,我的损坏版本每行末尾都有CR LF,而工作版本只有LF。我已经阅读了相关问题,并且据我所知,这与win/unix类型文件有关。但是我该如何删除CR?或者我应该使用export-csv以不同的编码导出文件?(尝试过Utf-8和标准..) - Sune
1
@Sune CR+LF 是Windows的方式,在Unix中只需要LF,因此Perl脚本似乎是期望在Unix环境下运行。但我们可以转换这个文件。请查看我的更新答案。 - Andy Arismendi
通常情况下,不需要转换文件,只需更改Perl读取文件的方式即可。 - Brad Gilbert
@BradGilbert 听起来像是OP在使用第三方Perl脚本。对他来说,将文件转换而不是重构Perl脚本可能更有意义...顺便问一下,任何想法什么解析方法会让Perl处理CR时出错? - Andy Arismendi

2

使用export-csv时可能会出现编码问题。

默认编码为ASCII,通常情况下应该没有问题,但请尝试在Export-CSV命令中设置-Encoding UTF8


所以你没有成功吗?或者你成功了? - Tom
不,我没有成功。解决方案是从CSV中删除CR。(请参见上面的答案) - Sune

1

来自CPAN Text::CSV

use Text::CSV;

my @rows;
my $csv = Text::CSV->new ( { binary => 1 } )  # should set binary attribute.
             or die "Cannot use CSV: ".Text::CSV->error_diag();

open my $fh, "<:encoding(utf8)", "test.csv" or die "test.csv: $!";
while ( my $row = $csv->getline( $fh ) ) {
  $row->[2] =~ m/pattern/ or next; # 3rd field should match
  push @rows, $row;
}
$csv->eof or $csv->error_diag();
close $fh;

永远不要尝试自己解析CSV,乍一看似乎很容易,但实际上有很多深坑可以掉进去。


我还没有编写导入 Csv 的 Perl 脚本,只有导出脚本 (PowerShell)。导入脚本随 nConf 软件包一起提供。也许我漏掉了什么,但我不确定你的答案是否提供了解决问题的方案? - Sune
1
@Sune,你在原帖中没有提到这一点。我的帖子假设你可以编辑Perl脚本。 - dgw

0

Excel通常会假定以.csv格式保存的文件是逗号分隔的。但是,看起来您正在使用分号。您可以尝试切换到逗号,或者如果这不是一个选项,尝试将扩展名更改为.txt。如果您选择前者,Excel应该会自动识别它,而后者则会在加载文件时带您通过导入向导。


谢谢Michael,但我将在Perl中处理该文件,我只是使用Excel查看内容以进行调试。 - Sune

0

根据其他帖子中的发现,我认为你最好的选择是:

  1. 将其转换为CSV字符串(使用Unix-y回车而不是Windows)
  2. 将其发送到文件中,确保编码不是ASCII。

$str = $object | convertto-csv -notypeinformation | foreach-object { $_ -replace "`"","" } #

foreach-object 是一种技巧,用于去除 convertto-csv 添加的额外引号。如果您的数据可能包含双引号,您需要寻找其他替代方案。

$str | out-file -filepath "path\to\newcsv" -encoding UTF8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接