4

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

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

更令人困惑的是:当我在记事本中打开文件并将内容复制/粘贴到新文件时,导入工作!

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

请帮忙:)

4

5 回答 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 转换 > Unix 格式)。

于 2012-01-22T00:34:36.990 回答
2

使用时可能是编码问题export-csv

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

于 2012-01-21T23:53:22.367 回答
1

来自CPAN 文本::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,乍一看似乎很容易,但有很多深坑。

于 2012-01-21T23:51:40.047 回答
0

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

于 2012-01-21T23:34:36.350 回答
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
于 2012-01-22T17:25:19.800 回答