我需要从目录中获取大量csv文件并将它们放入Powershell中的数组中(最终操作并写回CSV)。
问题是有5种文件类型。我需要大约8列。列基本相同,但标题不同。
有一种简单的方法吗?我开始使用我的8个字段创建一个自定义对象,循环导入每个字段的文件,查看文件名(告诉我我需要的列名称),然后将一堆ifs添加到我的自定义对象数组中。
我想知道是否有更简单的方法...就像模板说明每个文件中的哪些列一样。
答案 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一样做。