【发布时间】:2019-02-04 20:07:37
【问题描述】:
我正在尝试编写一个 Powershell 脚本,该脚本将占用几个非常长的以空格分隔的文件,并将一些列导出到名称相似的 CSV 文件中。
我确实有一个成功的版本:
Foreach ($file in $files) {
$WriteString=""
$outfile = $path + "\" + ($file -replace ".{4}$") + ".csv"
Get-Content -Path $path"\"$file | Select-Object -Skip $lines | ForEach-Object{
$ValueArray = ($_ -split "\s+")
$WriteString += $ValueArray[1] + "," + $ValueArray[2] + "," + $ValueArray[3] + "`n"
}
Add-Content -Path $outfile -Value $Writestring
}
这可行,但速度极慢 - 脚本完全运行需要 16 多个小时。主要原因(我认为)是添加到字符串中。我已经尝试使用哈希表改进这一点:
Foreach ($file in $files) {
$outfile = $path + "\" + ($file -replace ".{4}$") + ".csv"
$ParseLines = Get-Content -Path $path"\"$file | Select-Object -Skip $lines
$OutputData = ForEach ($Line in $ParseLines) {
$ValueArray = ($Line -split "\s+")
$Line | Select-Object $ValueArray[1], $ValueArray[2], $ValueArray[3]
}
$OutputData | Export-CSV -Path $outfile #-NoTypeInformation
}
但是,这只是导出哈希表的一行:
#TYPE Selected.System.String
"636050.000","7429825.000","77.438"
,,
,,
,,
,,
,,
,,
如果我将最后一行更改为:
Set-Content -Path $outfile -Value $OutputData
那么输出变成:
@{636050.000=; 7429825.000=; 77.438=}
@{636075.000=; 7429825.000=; 75.476=}
@{636100.000=; 7429825.000=; 74.374=}
@{636125.000=; 7429825.000=; 73.087=}
@{636150.000=; 7429825.000=; 71.783=}
@{636175.000=; 7429825.000=; 70.472=}
我显然对哈希表或 Export-CSV 做错了,但我无法弄清楚。任何帮助将不胜感激。
根据下面的要求,这里是一个源文件的一部分。我删除了所有非数据行,并且在我的输出 CSV 中不包含标题,因为输入程序(CSV 文件进入)不需要它们,并且输出是不言而喻的(没有太多机会仅通过查看数据就得到了错误的 X、Y 和 Z 值)。
*
* DEFINITION
* HEADER_VARIABLES 3
* QUALITIES C 16 0 key
* DATE C 12 0
* TIME C 12 0
* VARIABLES 4
* X F 12 3
* Y F 12 3
* Z F 12 3
* gcmaq0.drg F 12 3
*
* 1 2 3 4
*23456789012345678901234567890123456789012345678
* X| Y| Z| gcmaq0.drg|
*
* HEADER:QUALITIES 29Aug2018 13:53:16
636575.000 7429800.000 75.551 75.551
636600.000 7429800.000 77.358 77.358
636625.000 7429800.000 78.823 78.823
636650.000 7429800.000 80.333 80.333
636675.000 7429800.000 82.264 82.264
636700.000 7429800.000 84.573 84.573
636725.000 7429800.000 87.447 87.447
【问题讨论】:
-
您能否分享(部分)您的输入文件(包括标题)并将其添加到问题中?
标签: powershell csv hashtable