我在Powershell中生成带有EXPORT-CSV的CSV,然后将其提供给Perl脚本。但是Perl无法导入文件。
我已经针对工作版本(已经从相同的Perl脚本而不是PowerShell导出)验证了CSV文件,并且没有区别。 coloumns完全相同,它们都有分号作为分隔符。如果我在Excel中打开文件,但所有内容都会在每行的第一个单元格中结束(这意味着我必须进行文本到颜色)。工作文件从一开始就在不同的单元格中结束..
添加困惑:当我在记事本中打开文件并将内容复制/粘贴到新文件时导入有效!
那么,我错过了什么?是否有“隐藏”属性,我无法用记事本发现?我是否必须更改编码类型?
请帮助:)
答案 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)
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)
鉴于通过其他帖子发现了什么,我认为你最好的选择是:
$str = $object | convertto-csv -notypeinformation | foreach-object { $_ -replace "`"","" } #
foreach-object
是删除convertto-csv
添加的额外引号的黑客行为。如果您的数据可能包含双引号,则需要查看备选方案。
$str | out-file -filepath "path\to\newcsv" -encoding UTF8