创建搜索功能以仅在用户输入时支持通配符
create search function to support wildcard char only when it is input by user
我正在编写一个函数来搜索(不区分大小写)CSV 文件。为了对此进行测试,我使用了一个数组,并使用用户输入来检查该数组。如果用户输入一个 wildstar 并且它的位置也很重要,我只希望搜索包括一个 wildstar。
例如(在伪代码中),给定 $array = "Hanna", "Anna", "Ann"
if userInput = Ann
output = "Ann"
If userInput = Ann*
output = "Ann", "Anna"
if userInput = *nna
output = "Anna"
if userInput = *nn*
output = "Hannah", "Anna", "Ann"
if userInput = *Hanna*
output = "Hanna"
if userInput = Hanna
output = "Hanna"
等等...
我正在使用 CSV 文件 test1.csv
:
test1Column1,test1Column2,test1Column3
Hannah,12345,
Anna,1234,
Ann,2345,
我有以下代码:
Function SearchContentName
{
Param ($userSearchContent)
If ($userSearchContent -Contains '`*')
{
Import-Csv test1.csv | % {if ($_.test1Column1 -Match $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
}
ElseIf ($userSearchContent -NotContains '`*')
{
Import-Csv test1.csv | % {if ($_.test1Column1 -Eq $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
}
}
Function Main
{
$userSearchContent = Read-Host "Enter Name"
SearchContentName $userSearchContent
}
Main
谁能告诉我我做错了什么?
您使用了错误的运算符。由于您想允许通配符匹配,只需对所有用户输入使用 -like
:
Function SearchContentName {
Param ($userSearchContent)
Import-Csv test1.csv | ForEach-Object {
if ($_.test1Column1 -like $userSearchContent) {
$_.test1Column1
}
} | Set-Content testresults.csv
}
-match
运算符用于正则表达式,您必须将 "any number of characters" 表示为 .*
,而不仅仅是 *
。如果 $userSearchContent
不包含通配符,则 -like
运算符的行为类似于 -eq
,因此您无需区分不同的情况。
如果您希望输出 CSV 包含整行并且 headers,请使用 Where-Object
而不是使用嵌套在 ForEach-Object
中的 if
进行过滤:
Function SearchContentName {
Param ($userSearchContent)
Import-Csv test1.csv | Where-Object {
$_.test1Column1 -like $userSearchContent
} | Export-Csv testresults.csv -NoType
}
我正在编写一个函数来搜索(不区分大小写)CSV 文件。为了对此进行测试,我使用了一个数组,并使用用户输入来检查该数组。如果用户输入一个 wildstar 并且它的位置也很重要,我只希望搜索包括一个 wildstar。
例如(在伪代码中),给定 $array = "Hanna", "Anna", "Ann"
if userInput = Ann
output = "Ann"
If userInput = Ann*
output = "Ann", "Anna"
if userInput = *nna
output = "Anna"
if userInput = *nn*
output = "Hannah", "Anna", "Ann"
if userInput = *Hanna*
output = "Hanna"
if userInput = Hanna
output = "Hanna"
等等...
我正在使用 CSV 文件 test1.csv
:
test1Column1,test1Column2,test1Column3
Hannah,12345,
Anna,1234,
Ann,2345,
我有以下代码:
Function SearchContentName
{
Param ($userSearchContent)
If ($userSearchContent -Contains '`*')
{
Import-Csv test1.csv | % {if ($_.test1Column1 -Match $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
}
ElseIf ($userSearchContent -NotContains '`*')
{
Import-Csv test1.csv | % {if ($_.test1Column1 -Eq $userSearchContent){$_.test1Column1}} | Export-Csv testresults.csv -NoTypeInformation
}
}
Function Main
{
$userSearchContent = Read-Host "Enter Name"
SearchContentName $userSearchContent
}
Main
谁能告诉我我做错了什么?
您使用了错误的运算符。由于您想允许通配符匹配,只需对所有用户输入使用 -like
:
Function SearchContentName {
Param ($userSearchContent)
Import-Csv test1.csv | ForEach-Object {
if ($_.test1Column1 -like $userSearchContent) {
$_.test1Column1
}
} | Set-Content testresults.csv
}
-match
运算符用于正则表达式,您必须将 "any number of characters" 表示为 .*
,而不仅仅是 *
。如果 $userSearchContent
不包含通配符,则 -like
运算符的行为类似于 -eq
,因此您无需区分不同的情况。
如果您希望输出 CSV 包含整行并且 headers,请使用 Where-Object
而不是使用嵌套在 ForEach-Object
中的 if
进行过滤:
Function SearchContentName {
Param ($userSearchContent)
Import-Csv test1.csv | Where-Object {
$_.test1Column1 -like $userSearchContent
} | Export-Csv testresults.csv -NoType
}