CSV的格式不正确?

时间:2012-01-21 23:30:26

标签: perl excel powershell csv export-to-csv

我在Powershell中生成带有EXPORT-CSV的CSV,然后将其提供给Perl脚本。但是Perl无法导入文件。

我已经针对工作版本(已经从相同的Perl脚本而不是PowerShell导出)验证了CSV文件,并且没有区别。 coloumns完全相同,它们都有分号作为分隔符。如果我在Excel中打开文件,但所有内容都会在每行的第一个单元格中结束(这意味着我必须进行文本到颜色)。工作文件从一开始就在不同的单元格中结束..

添加困惑:当我在记事本中打开文件并将内容复制/粘贴到新文件时导入有效!

那么,我错过了什么?是否有“隐藏”属性,我无法用记事本发现?我是否必须更改编码类型?

请帮助:)

5 个答案:

答案 0 :(得分: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转换> Unix格式)。

答案 1 :(得分:2)

使用export-csv

时可能是编码问题

默认值为ASCII,通常应该没问题,但请尝试在-Encoding UTF8命令中设置Export-CSV

答案 2 :(得分: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,乍一看似乎很容易,但有很多深坑。

答案 3 :(得分:0)

Excel倾向于假设以.csv格式保存的文件确实以逗号分隔。但是,似乎您使用的是分号。您可以尝试切换到逗号,或者如果这不是一个选项,请尝试将扩展名更改为.txt。如果您使用前者,Excel应自动识别它,而后者将在加载文件时引导您完成导入向导。

答案 4 :(得分:0)

鉴于通过其他帖子发现了什么,我认为你最好的选择是:

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

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

    foreach-object是删除convertto-csv添加的额外引号的黑客行为。如果您的数据可能包含双引号,则需要查看备选方案。

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