在Powershell中组合CSV文件-不同的标题

在Powershell中组合CSV文件-不同的标题,powershell,Powershell,我需要从一个目录中获取大量csv文件,并将它们放入Powershell中的一个数组中,以便最终操作并写回csv 问题是有5种文件类型。我需要大约8列从每个。这些列基本相同,但标题不同 有没有一个简单的方法可以做到这一点?我开始用我的8个字段创建一个自定义对象,在文件中循环导入每个字段,查看文件名,它告诉我需要的列名,然后是一堆ifs将其添加到自定义对象数组中 我想知道是否有一种更简单的方法…比如用一个模板说明每个文件中的哪些列。最后这样做了。它可能不是最有效率的,但很有效。最后,我分别写出了每个

我需要从一个目录中获取大量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对象循环生成的自定义对象可以很快解决这个问题。