我正在寻找一种方法(如果可能的话)找到任何包含“;”的列中的任何匹配分号字符并返回列/字段名称。
我基本上是在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。
答案 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."$_"
}
}
}
}