我有两个这样的CSV文件:
CSV1:
Name test; test & example; test & example & testagain;
CSV2:
Name test1; test&example; test & example&testagain;
我想将CSV1的每一行与CSV2的每一行进行比较,如果前5个字母匹配,则写入结果。
我可以比较它们,但前提是完全匹配:
$CSV1 = Import-Csv -Path ".\client.csv" -Delimiter ";"
$CSV2 = Import-Csv ".\client1.csv" -Delimiter ";"
foreach ($record in $CSV1) {
$result = $CSV2 | Where {$_.name -like $record.name}
$result
}
答案 0 :(得分:2)
您可以使用Compare-Object
和自定义属性定义来实现。
Compare-Object $CSV1 $CSV2 -Property {$_.name -replace '^(.{5}).*', '$1'} -PassThru
$_.name -replace '^(.{5}).*', '$1'
将从属性name
中获取前5个字符(如果字符串少于5个字符,则取少于5个字符),并删除其余的字符。然后,此属性用于比较$CSV1
和$CSV2
中的记录。参数-PassThru
使cmdlet发出原始数据,而不是仅具有custom属性的对象。理论上,您也可以使用$_.name.Substring(0, 5)
代替正则表达式替换来提取前5个字符。但是,如果名称少于5个字符(如$CSV1
的第一条记录),则会引发错误。
默认情况下,Compare-Object
输出输入对象之间的差异,因此,您还需要添加参数-IncludeEqual
和-ExcludeDifferent
以获得匹配的记录。
通过Select-Object * -Exclude SideIndicator
插入结果,以从输出中删除属性SideIndicator
。
答案 1 :(得分:0)
table#dataTable.table.table-bordered(width='100%', cellspacing='0')
thead
tr
th ID
th Name
th Type
th URL
//- th explanation
th Image
th Keyword
th Project Start
th Porject End
th Github URL
tbody
each data in dataArray
tr
td
a(href=`/${userId}/${data.id}`)=`${data.id}`
td= `${data.name}`
td= `${data.type}`
td
a(href=`${data.url}`)=`${data.url}`
//- td= `${data.explanation}`
td
img(src=`${data.imgurl}`)
td= `${data.sumlang}`
td= `${data.pjdate1}`
td= `${data.pjdate2}`
td
a(href=`${data.githuburl}`)=`${data.githuburl}`
或:
foreach ($record in $CSV1) {
$CSV2 | Where {"$($_.name)12345".SubString(0, 5) -eq "$($record.name)12345".SubString(0, 5)} |
ForEach {[PSCustomObject]@{Name1 = $Record.Name; Name2 = $_.Name}}
}
使用此Join-Object
cmdlet:
... | Where {($_.name[0..4] -Join '') -eq ($record.name[0..4] -Join '')} | ...
以上所有结果为:
$CSV1 | Join $CSV2 `
-Using {($Left.name[0..4] -Join '') -eq ($Right.name[0..4] -Join '')} `
-Property @{Name1 = {$Left.Name}; Name2 = {$Right.Name}}