在列和列之内的Powershell搜索命中返回列名

时间:2016-06-02 06:23:23

标签: powershell powershell-ise powershell-v5.0

我正在寻找一种方法(如果可能的话)找到任何包含“;”的列中的任何匹配分号字符并返回列/字段名称。

我基本上是在DAT分隔的文本文件(或csv)中加载的。标题每次都会有所不同,但我基本上试图弄清楚我是否期望任何列包含列中的多分隔值,例如电子邮件CC或BCC。

我正在使用带有文本框的表单来输入DAT / CSV。

$form.Topmost = $True

$form.Add_Shown({$textBox.Select()})
$result = $form.ShowDialog()

if ($result -eq [System.Windows.Forms.DialogResult]::OK)
{
    $x = $textBox.Text 
    $x
}

这是输出文件的代码:

  Get-Content $x |
    foreach {$_ -replace "þ", '"'} |
    ConvertFrom-Csv -Delimiter "" |
    Out-GridView 

我已经能够使用以下方法搜索整个CSV上的匹配:

$FileContent = Get-Content $x
$Matches = Select-String -InputObject $FileContent -Pattern ';' -AllMatches
$Matches.Matches.Count

以上部分确实给了我“;”的总数命中。但我宁愿看到哪些列被击中,我真的不需要总计数,只需要标题名称或列号。

我正在使用PowerShell ISE v5。

1 个答案:

答案 0 :(得分:0)

我会使用Select-String来查找初始匹配,这比通过每个列和行循环更快。您可以通过将每个找到的行转换为CSV然后转换为对象来循环遍历结果。您需要做的就是循环每个属性并输出结果。像这样:

$file = 'your_file.csv'
$head = Get-Content $file -TotalCount 1
$re = ';'

Select-String $file -Pattern $re | % {
  $line = $_
  $item = $head + "`n" + $_.line | ConvertFrom-Csv
  $item | gm -MemberType NoteProperty | select -ExpandProperty Name | % {
    if($item."$_" -match $re) {
      New-Object psobject -property @{
        Column = $_
        Row = $line.Linenumber
        Value = $item."$_"
      }
    }
  }
}