如何读取CSV文件,但使用Get-Content排除包含空格的某些列

时间:2016-09-14 14:47:59

标签: powershell csv

我想读取CSV文件,并排除动态选定列包含空格的行,但不是动态选定列的所有行都包含空格。

尝试在下面的语句中使用where子句(但不起作用):

Get-Content $Source -ReadCount 1000 |
  Where {
    ForEach($NotEqualBlankCol in $BlankColumns)
    {
      $NotEqualBlankCol -ne $null -and $NotEqualBlankCol -ne ''}
    } |
      ConvertFrom-Csv |
        Sort-Object -Property $SortByColNames.Replace('"', '') -Unique |
          .
          .
          .
            | Out-File $Destination

$ BlankColumns是我的动态对象字符串数组,我想循环包含空白的CSV列名。它可以是1列或更多。当多个所有选定列都需要为空时,才有资格作为不需要包含在最终CSV文件输出中的行。

如何使用Get-Content执行此操作?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

使用Get-Content

确定。那么这将做什么,一次读取文件X行的内容。它会将每一行解析为其不同的列。然后它将检查指定的列是否有空白。如果任何标记列包含黑色,则会将其过滤掉。考虑我用于此

的测试数据
id,first_name,last_name,email,gender,ip_address
1,Christina,Tucker,ctucker0@bbc.co.uk,Female,91.33.192.187
2,Jacqueline,Torres,jtorres1@shop-pro.jp,Female,205.70.183.107
3,Kathy,Perez,kperez2@hugedomains.com,Female,35.175.154.127
4,"",Holmes,eholmes3@canalblog.com,,
5,Ernest,Walker,ewalker4@marketwatch.com,Male,140.110.129.21
6,,Garza,cgarza5@jugem.jp,,
7,,Cunningham,jcunningham6@ox.ac.uk,Female,
8,,Clark,lclark7@posterous.com,,
9,,Ortiz,lortiz8@shareasale.com,,

请注意,其中一些人的first_name和gender为空。 id 1,2,3,5,10有完整的数据。其余的应该过滤。

$BlankColumns = "first_name","gender"
$headers = (Get-Content $path -TotalCount 1).Split(",")
$potentialBlankHeaderIndecies = 0..($headers.Count - 1) | Where-Object{$BlankColumns -contains $headers[$_]}
$potentialBlankHeaderIndecies 

Get-Content $path -ReadCount 3 | Foreach-Object{
    # Check to see if any of the indexes from a split are empty
    $_ | Where-Object{
        [bool[]](($_.Split(","))[$potentialBlankHeaderIndecies] | ForEach-Object{
            ![string]::IsNullOrEmpty($_.Trim('"'))
        }) -notcontains $false
    }
}

此代码的输出是带有已删除条目的文件(字符串)。您可以将其传输到变量,文件或甚至您需要的内容中。

为了更详细一些,我们采用我们想要检查的标题名称,并在csv文件的第一行读取。那应该包含列名。使用它我们确定我们想要仔细检查的列索引。我们读入整个文件并逐行解析。对于每一行,我们在逗号上拆分并检查与标识的标题匹配的元素。如果这些元素为空或空,请检查每个元素。我们修剪引号,以防它是一个字符串""我认为你会算空白。在我们评估为布尔值的所有元素中,无论它是否为空。如果至少有一个则失败where-object子句并且被忽略。

使用Import-CSV

$BlankColumns = "first_name","gender"

Import-CSV $path | Where-Object{
    $line = $_
    ($BlankColumns | ForEach-Object{
        ![string]::IsNullOrEmpty(($line.$_.Trim('"')))
    }) -notcontains $false
}

非常类似的方法,因为我们现在处理对象而不是字符串,所以开销很少。

现在您可以使用Export-CSVConvertFrom-CSV,具体取决于您在项目其余部分的需求。

更改过滤条件。

以上两个示例都过滤了任何列包含空格的列。如果您只想忽略所有为空白的位置,请将行}) -notcontains $false更改为}) -contains $true