在Import-Csv上排除一行

问题描述 投票:1回答:1

我在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文件的当前名称并覆盖它吗?

powershell csv
1个回答
3
投票

您不能使cmdlet Import-Csv跳过特定行,但您还有其他几个选项:

  1. 在从CSV转换之前过滤掉该行: Get-Content $file | where { $_ -notmatch "--" } | ConvertFrom-Csv -Delim ";"
  2. 导入CSV后过滤掉项目: Import-Csv $file -Delim ";" | where { $_ -notmatch "--" }
  3. 由@AnsgarWiechers提出(导入后跳过第1项): Import-Csv $file -Delim ";" | select -Skip 1
© www.soinside.com 2019 - 2024. All rights reserved.