在Powershell中组合CSV文件-不同的标题
我需要从一个目录中获取大量csv文件,并将它们放入Powershell中的一个数组中,以便最终操作并写回csv 问题是有5种文件类型。我需要大约8列从每个。这些列基本相同,但标题不同 有没有一个简单的方法可以做到这一点?我开始用我的8个字段创建一个自定义对象,在文件中循环导入每个字段,查看文件名,它告诉我需要的列名,然后是一堆ifs将其添加到自定义对象数组中在Powershell中组合CSV文件-不同的标题,powershell,Powershell,我需要从一个目录中获取大量csv文件,并将它们放入Powershell中的一个数组中,以便最终操作并写回csv 问题是有5种文件类型。我需要大约8列从每个。这些列基本相同,但标题不同 有没有一个简单的方法可以做到这一点?我开始用我的8个字段创建一个自定义对象,在文件中循环导入每个字段,查看文件名,它告诉我需要的列名,然后是一堆ifs将其添加到自定义对象数组中 我想知道是否有一种更简单的方法…比如用一个模板说明每个文件中的哪些列。最后这样做了。它可能不是最有效率的,但很有效。最后,我分别写出了每个
我想知道是否有一种更简单的方法…比如用一个模板说明每个文件中的哪些列。最后这样做了。它可能不是最有效率的,但很有效。最后,我分别写出了每个文件,并在最后进行了合并,因为PS真的陷入了超过一百万行的合并中
$Newcsv = @()
$path = "c:\scrap\BWFILES\"
$files = gci -path $path -recurse -filter *.csv | Where-Object { ! ($_.psiscontainer) }
$counter=1
foreach($file in $files)
{
$csv = Import-Csv $file.FullName
if ($file.Name -like '*SAV*')
{
$Newcsv = $csv | Select-Object @{Name="PRODUCT";Expression={"SV"}},DMBRCH,DMACCT,DMSHRT
}
if ($file.Name -like '*TIME*')
{
$Newcsv = $csv | Select-Object @{Name="PRODUCT";Expression={"TM"}},TMBRCH,TMACCT,TMSHRT
}
if ($file.Name -like '*TRAN*')
{
$Newcsv = $csv | Select-Object @{Name="PRODUCT";Expression={"TR"}},DMBRCH,DMACCT,DMSHRT
}
if ($file.Name -like '*LN*')
{
$Newcsv = $csv | Select-Object @{Name="PRODUCT";Expression={"LN"}},LNBRCH,LNNOTE,LNSHRT
}
$Newcsv | Export-Csv "C:\scrap\$file.name$counter.csv" -force -notypeinformation
$counter++
}
get-childItem "c:\scrap\*.csv" | foreach {
$filePath = $_
$lines = $lines = Get-Content $filePath
$linesToWrite = switch($getFirstLine) {
$true {$lines}
$false {$lines | Select -Skip 1}
}
$getFirstLine = $false
Add-Content "c:\scrap\combined.csv" $linesToWrite
}
使用哈希表作为参考,进行一点正则表达式匹配,并在ForEach对象循环别名%中使用自动变量$Matches,所有这些都可以缩短为:
$path = "c:\scrap\BWFILES\"
$Reference = @{
'SAV' = 'SV'
'TIME' = 'TM'
'TRAN' = 'TR'
'LN'='LN'
}
Set-Content -Value "PRODUCT,BRCH,ACCT,SHRT" -Path 'c:\scrap\combined.csv'
gci -path $path -recurse -filter *.csv | Where-Object { !($_.psiscontainer) -and $_.Name -match ".*(SAV|TIME|TRAN|LN).*"}|%{
$Product = $Reference[($Matches[1])]
Import-CSV $_.FullName | Select-Object @{Name="PRODUCT";Expression={$Product}},*BRCH,@{l='Acct';e={$_.LNNOTE, $_.DMACCT, $_.TMACCT|?{$_}}},*SHRT | ConvertTo-Csv -NoTypeInformation | Select -Skip 1 | Add-Content 'c:\scrap\combined.csv'
}
这将产生完全相同的文件。唯一棘手的部分是LNNOTE/TMACCT/DMACCT字段,因为显然你不能像like*SHRT那样做。无论如何,我不会在这一点上打扰你这个特定问题的代码,因为你似乎想离开你已经拥有的,但是。。。至少你可以给我们看一些标题的例子?除了不同的标题外,CSV:s是否相同?是否所有CSV:s的列都以相同的方式排列,但列名不同?否,列因文件格式而异。有些有更多,有些有更少,我需要的列不会像每个文件中的第3列那样出现在同一个位置。我在想,我是否可以创建一个数组数组,其中包含每种文件类型的列名或其他内容,并使用它。列名不会在文件中重复,因此假设我需要文件格式1中的列TTAcct,在任何其他文件格式中都没有TTAcct,所以我不需要担心。请给我们一个或两个文件名的示例,或者更好地解释一下。例如,名称中是否包含标题?是否所有以“黄色”开头的文件都有相同的标题?我认为一个Switch语句、一些RegEx和用Select语句或ForEach对象循环生成的自定义对象可以很快解决这个问题。