Powershell循环csv文件一次导出一个csv行

时间:2016-09-26 21:19:46

标签: powershell

我正在尝试循环管道分隔文件,检查该行是否有28列,然后将该行导出到该文件。这是我正在寻找的主要问题和答案(我已经研究了很多,但我是PS的新手以及我需要一些帮助的许多不同方式)。以下工作但有两个问题。导出文件不允许我选择管道分隔,输出按字段名称按字段名称排序,而不是按顺序排列。

另外,有没有办法让输出不是“文本”合格的?

$path = Get-ChildItem c:\temp\*.txt

$staticPath = '0859'
$year = Get-Date -format yy
$month = Get-Date -format MM
$day = Get-Date -format dd
$output =  'c:\temp\' + $year + $month + $day + $staticPath + '.TXT'
$outputbad = 'c:\temp\BAD' + $year + $month + $day + $staticPath + '.TXT'



$input = 'c:\temp\' + $path.Name
$input

$csv = Import-Csv -path $input -Delimiter "|"

foreach($line in $csv)
{ 

$properties = $line | Get-Member -MemberType Properties
$row = ''
$properties.Count
$obj = new-object PSObject

for($i=0; $i -lt $properties.Count;$i++)
{

    $column = $properties[$i]
    $columnvalue = $line | Select -ExpandProperty $column.Name
    #$row += $columnvalue
    $obj | add-member -membertype NoteProperty -name $column.Name -value     $columnvalue
    }


    if($properties.Count -eq 28)
    {
        $obj | export-csv -Path $output -Append  -NoTypeInformation
        #$row | Export-Csv -Path $output -Append -Delimiter "|" -NoTypeInformation

    }
    else
    {
        $obj | Export-Csv  -Path $outputbad -Append -Delimiter "|" -NoTypeInformation

    }
} 

2 个答案:

答案 0 :(得分:1)

如果您想避免更改这些行文件的格式,可能您不想使用-CSV命令。 Export-csv可以添加引号等。这可以做你想要的不同方式:

$path | ForEach-Object { 
    $good = @()
    $bad = @()
    Get-Content $_ | ForEach-Object { 
        if (($value = $_ -split '\|').length -eq 28) { 
            $good += $_ 
        } else { 
            $bad += $_ 
        }
    }
    if ($good) { Out-File -Append -InputObject $good $output }
    if ($bad) { Out-File -Append -InputObject $bad $outputbad }
}

但请注意,这将计算包含管道的引用值与import-csv不同。有时会在没有任何引用逻辑的情况下生成管道分隔值。

$values变量将是一个单独列的数组,因此如果您想编写一些代码以在if内修复它们,您可以使用它然后将它们与{{{ 1}},或者可能使用另一个正则表达式来修复错误。

答案 1 :(得分:0)

傻我,这就是答案。但是如果有人能够回答为什么PSObject或属性循环是按字母顺序排列的,那将会有所帮助。很快我想添加智能来检查序数(不是字母字段名称顺序)一个字段,如果它是一个整数或不,那么我知道如何修复BAD记录。

{{1}}