导出csv仅吐出长度

时间:2013-03-20 20:57:30

标签: powershell

我只能在将其导出到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”

3 个答案:

答案 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编写输出(最快)