我正在尝试循环管道分隔文件,检查该行是否有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
}
}
答案 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)
{{1}}