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

时间:2015-09-28 16:52:01

标签: powershell

我需要从目录中获取大量csv文件并将它们放入Powershell中的数组中(最终操作并写回CSV)。

问题是有5种文件类型。我需要大约8列。列基本相同,但标题不同。

有一种简单的方法吗?我开始使用我的8个字段创建一个自定义对象,循环导入每个字段的文件,查看文件名(告诉我我需要的列名称),然后将一堆ifs添加到我的自定义对象数组中。

我想知道是否有更简单的方法...就像模板说明每个文件中的哪些列一样。

2 个答案:

答案 0 :(得分:0)

这样做了。它可能不是最有效的,但有效。我最后单独写出每个文件并最后合并,因为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
}

答案 1 :(得分:0)

使用哈希表进行引用,进行一点RegEx匹配,并在$Matches循环中使用自动变量ForEach-Object(使用别名%),这些变量都可以缩短为:

$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领域,因为显然你不能像* SHRT一样做。