使用导入 CSV 整合数据
Consolidate data with import CSV
我正在尝试找到一种在导出前收集数据的方法,以便从文件中获取更多数据并合并然后导出。
我的代码是这样的:从多个来源查找用户和计算机并整合数据 → 创建 2 列(名称、计算机)的数组 → 将该数据导出到 output.log
因为我正在寻找的数据会不时动态变化,所以我希望每天多次 运行 脚本,所以
下次 运行 从 output.log 获取数据到数组 → 继续收集新数据并将它们添加到现有的 output.log.
目前,每次我 运行 代码都会覆盖 output.log。
我的代码是这样的:
Set-Variable -Name Computer -Value @("pc1","pc2")
Set-Variable -Name LogNames -Value @("something")
$el_c = @()
foreach ($comp in $Computer) {
foreach ($log in $LogNames) {
$el = ... # get data I need from $comp
$el_c += $el #consolidating
}
}
$el_c | %{
$_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}}
} | Export-Csv "C:\test\OutputRaw.log"
$input = 'C:\test\OutputRaw.log' #TO FILTER OUT DUPLICATION
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation
输出为:
"Name","Computer"
"Dan","PC1"
"Tom","PC2"
我如何在提取到文件之前实现它同时将 "output.log" 和 merge/add/consolidate 中的数据放入新收集的数据中?
使用Export-CSV
的-Append
参数:
Export-Csv "C:\test\Output.log" -Append
假设已经创建了一个日志(我称之为Log.csv
)($Computer | Export-CSV .\Log.csv
):
Import-CSV .\Log.csv | LeftJoin $Computer Name -Merge {$Right.$_} | Export-CSV .\Log.csv
有关 LeftJoin
(Join-Object
) 的详细信息,请参阅:
感谢 Paul 的帮助,我使用了 -Append 然后在最后添加了另一个过滤器副本。
$el_c | %{
$_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}}
} | Export-Csv "C:\test\OutputRaw.log"
$input = 'C:\test\OutputRaw.log'
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -Append -NoTypeInformation
$input = 'C:\test\OutputFinal.log'
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation
使用管道和Compare-Object
。将 select
语句移动到内部 foreach
循环中。
$Computer = 'pc1', 'pc2'
$LogNames = 'something'
$csv = 'C:\test\OutputFinal.log'
$ref = Import-Csv $csv
$Computer | ForEach-Object {
$comp = $_
foreach ($log in $LogNames) {
... | # get data from $comp
select @{n='Name';e={$_.Properties[0].value}},
@{n='Computer';e={$_.Properties[1].value}}
}
} | Where-Object {
Compare-Object $_ $ref -Property 'Name','Computer' -IncludeEqual -ExcludeDifferent
} | Export-Csv $csv -Append -NoType
我正在尝试找到一种在导出前收集数据的方法,以便从文件中获取更多数据并合并然后导出。
我的代码是这样的:从多个来源查找用户和计算机并整合数据 → 创建 2 列(名称、计算机)的数组 → 将该数据导出到 output.log
因为我正在寻找的数据会不时动态变化,所以我希望每天多次 运行 脚本,所以 下次 运行 从 output.log 获取数据到数组 → 继续收集新数据并将它们添加到现有的 output.log.
目前,每次我 运行 代码都会覆盖 output.log。
我的代码是这样的:
Set-Variable -Name Computer -Value @("pc1","pc2")
Set-Variable -Name LogNames -Value @("something")
$el_c = @()
foreach ($comp in $Computer) {
foreach ($log in $LogNames) {
$el = ... # get data I need from $comp
$el_c += $el #consolidating
}
}
$el_c | %{
$_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}}
} | Export-Csv "C:\test\OutputRaw.log"
$input = 'C:\test\OutputRaw.log' #TO FILTER OUT DUPLICATION
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation
输出为:
"Name","Computer" "Dan","PC1" "Tom","PC2"
我如何在提取到文件之前实现它同时将 "output.log" 和 merge/add/consolidate 中的数据放入新收集的数据中?
使用Export-CSV
的-Append
参数:
Export-Csv "C:\test\Output.log" -Append
假设已经创建了一个日志(我称之为Log.csv
)($Computer | Export-CSV .\Log.csv
):
Import-CSV .\Log.csv | LeftJoin $Computer Name -Merge {$Right.$_} | Export-CSV .\Log.csv
有关 LeftJoin
(Join-Object
) 的详细信息,请参阅:
感谢 Paul 的帮助,我使用了 -Append 然后在最后添加了另一个过滤器副本。
$el_c | %{
$_ | select @{n='Name';e={$_.Properties[0].value}}, @{n='Computer';e={$_.Properties[1].value}}
} | Export-Csv "C:\test\OutputRaw.log"
$input = 'C:\test\OutputRaw.log'
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -Append -NoTypeInformation
$input = 'C:\test\OutputFinal.log'
$inputCsv = Import-Csv $input | Sort-Object * -Unique
$inputCsv | Export-Csv "C:\test\OutputFinal.log" -NoTypeInformation
使用管道和Compare-Object
。将 select
语句移动到内部 foreach
循环中。
$Computer = 'pc1', 'pc2'
$LogNames = 'something'
$csv = 'C:\test\OutputFinal.log'
$ref = Import-Csv $csv
$Computer | ForEach-Object {
$comp = $_
foreach ($log in $LogNames) {
... | # get data from $comp
select @{n='Name';e={$_.Properties[0].value}},
@{n='Computer';e={$_.Properties[1].value}}
}
} | Where-Object {
Compare-Object $_ $ref -Property 'Name','Computer' -IncludeEqual -ExcludeDifferent
} | Export-Csv $csv -Append -NoType