我只能在将其导出到csv时得到长度,应该如何正确完成。
$redo = Import-CSV c:\temp\testimport.txt | Group-Object email |
foreach { "{0} ,{1}" -f $_.Name, (($_.Group | foreach { $_.group }) -join ', ')
}
$redo | Export-CSV c:\temp\test.csv -NoTypeInformation
#
“长度”“46”“59”“110”“47”“149”“38”“69”“32”“62”“29”“49”“31” “27”“48”“55”“42”
答案 0 :(得分:4)
Export-Csv
期望一个对象(或一个对象列表)具有属性,而命令管道生成一个字符串数组。如果将此数组提供给Export-Csv
,则cmdlet将获取每个给定项的属性(对于字符串仅为Length
)并将这些属性写入输出文件。
您需要构建具有所需属性的对象列表,例如:
Import-CSV c:\temp\testimport.txt `
| Group-Object email `
| select @{n="Name";e={$_.Name}},@{n="Group";e={($_.Group | %{$_.group}) -join ', '}} `
| Export-CSV c:\temp\test.csv -NoTypeInformation
答案 1 :(得分:0)
这正是我想要的。所以我只想补充一下,我的评论确保每个人都理解
这样做 NOT 工作:
$str_list = @('Mark','Henry','John')
$str_list | Export-Csv .\ExportStrList.csv -NoType
因为Export-Csv
获取对象和输出属性。 String []的唯一属性是Length
,因此CSV文件只包含长度。
要解决这个问题,就像最后一个人说的那样,我们需要将String []更改为Object []。最简单的方法是使用Select-Object
将每个String放入新Object []的Name属性中,如下所示:
$str_list = @('Mark','Henry','John')
$str_list = $str_list | Select-Object @{Name='Name';Expression={$_}}
$str_list | Export-Csv .\ExportStrList.csv -NoType
为了重新迭代,Select-Object
输出一个可以轻松操作的自定义PSObject。这是非常强大的信息,明智地使用它。
答案 2 :(得分:0)
显示用于将数据转换为对象的方法是一种非常长期的方法,至少在我的情况下。 我正在开发与IBM V7000 SAN存储子系统集成的报告及其CLI,我可以使用putty plink从PS调用,根据查询返回表格输出(可以是CSV)或列表。 从我想要将数据导出为CSV。 从列表输出中我循环遍历结果集(一行=一个字段)并将字段组合成一个字符串,用逗号分隔值。 (对于表格输出,我跳过这个繁琐的步骤。)
以下工作将输出写入CSV文件,然后我可以将其作为电子表格打开。
$fhStream = [System.IO.StreamWriter] "20150527_QALUNTable.csv"
$fhStream.WriteLine($stColumnHeadings)
$fhStream.WriteLine($stColumnValues)
$fhStream.Close()
Import-Csv用于将输入作为一个对象返回,我可以轻松地使用它来准备我的报告(这些报告是由许多这样的输出文件组合而成,每个文件都在一个单独的时间点收集 - 因此是日期戳前缀)。
此处共有57列数据,因此转换为CSV时我会避免准备57个对象语句。
(找到.Net技术,用于在http://blogs.technet.com/b/gbordier/archive/2009/05/05/powershell-and-writing-files-how-fast-can-you-write-to-a-file.aspx编写输出(最快)