【发布时间】:2011-04-28 14:11:49
【问题描述】:
今天我刚刚整理了这个 PowerShell 脚本
-
采用制表符分隔的文本文件,
-
将其读入内存,
-
根据特定列的不同值进行可变数量的过滤查询
-
创建一个新的空 Excel 工作簿
-
将过滤数据的每个子集添加到 一个新的 Excel 工作表
最后一步是我卡住的地方。目前,我的代码以展开/转置的“键:值”条目的形式将几行数据放入工作表的一个范围内,从而形成水平数据布局。始终覆盖相同范围的数据。
我想要垂直布局形式的数据,即列中的数据,就像使用 MS Excel 的导入文件向导导入 CSV 文件一样。
有没有比下面更简单的方法?
我承认,某些 PowerShell 功能以一种货物崇拜的编程模式粘贴到这里。请注意,我没有任何 PowerShell 经验。几年前我做了一些批处理文件,VBScript 和VBA 编码。因此,也欢迎其他批评。
PARAM (
[Parameter(ValueFromPipeline = $true)]
$infile = ".\04-2011\110404-13.txt"
)
PROCESS {
echo " $infile"
Write-Host "Num Args:" $args.Length;
$xl = New-Object -comobject Excel.Application;
$xl.Visible = $true;
$Workbook = $xl.Workbooks.Add();
$content = Import-Csv -delimiter "`t" $infile;
$ports = $content | Select-Object Port# | Sort-Object Port# -Unique -Descending;
$ports | ForEach-Object {
$p = $_;
Write-Host $p.{Port#};
$Worksheet = $Workbook.Worksheets.Add();
$workSheet.Name = [string]::Format("{0} {1}", "PortNo", $p.{Port#});
$filtered = $content | Where-Object {$_.{Port#} -eq $p.{Port#} };
$filtered | ForEach-Object {
Write-Host $_.{ObsDateTime}, $_.{Port#}
}
$filtered | clip.exe;
$range = $Workbook.ActiveSheet.Range("a2", "a$($filtered.count)");
$Workbook.ActiveSheet.Paste($range, $false);
}
$xl.Quit()
}
数据输出示例
错误
Port# : 1
Obs# : 1
Exp_Flux : 0,99
IV Cdry : 406.96
IV Tcham : 16.19
IV Pressure : 100.7
IV H2O : 9.748
IV V3 : 11.395
IV V4 : 0.759
IV RH : 53.12
对
Port# Obs# Exp_Flux IV Cdry IV Tcham IV Pressure IV H2O IV V3 IV V4 IV RH
1 1 0,99 406.96 16.19 100.7 9.748 11.395 0.759 53.12
【问题讨论】:
标签: excel powershell