我在PowerShell中有一个关于Import-Csv
的问题。我的脚本读取目录中的所有* .csv文件并将其写入我的MS SQL数据库。到目前为止这么好,但我在这些csv文件中有问题。它们看起来都像这样:
Header1;Header2;Header3 -----;-----;----- Data1;Data2;Data3 Data1;Data2;Data3
等等。
我的代码看起来像这样:
foreach ($File in (Get-ChildItem -Path 'C:\data\*.csv')) {
Import-Csv $File -Delim ';' | ForEach-Object {
Invoke-Sqlcmd -Database $SQLDatabase -ServerInstance $SQLInstance -Query "insert into dbo.customer_data VALUES ('$($_."Instance Name"............)'
如果我用“---”删除行,则工作正常,因为PowerShell无法将其转换为整数。
问题:使用Import-Csv
时是否有忽略行的解决方案?我发现我可以跳过Get-Content
的行,但似乎这只能跳过行列表而不是特定行。我还考虑过导出没有这行的csv文件:
foreach ($File in (Get-ChildItem -Path 'C:\data\*.csv')) {
Import-Csv $File -Delim ';' |
where {$_."Instance Name" -ne "-------------"} |
Export-Csv "C:\data\BaseName.csv" -NoTypeInfo
但我认为这不是一个好的解决方案,因为文件现在翻了一倍,我对PowerShell中的Name占位符一无所知。或者我可以实际获取csv文件的当前名称并覆盖它吗?
您不能使cmdlet Import-Csv跳过特定行,但您还有其他几个选项:
Get-Content $file | where { $_ -notmatch "--" } | ConvertFrom-Csv -Delim ";"
Import-Csv $file -Delim ";" | where { $_ -notmatch "--" }
Import-Csv $file -Delim ";" | select -Skip 1