Powershell export-csv返回数字

时间:2016-01-23 11:59:28

标签: csv powershell powershell-v2.0

我无法理解为什么我的csv导出只返回数字而不是我想要的字符串。当我使用out-file而不是export-csv时,一切看起来都很好。

var req = new XMLHttpRequest();
req.open('GET', "https://api.spotify.com/v1/tracks/0YGQ3hZcRLC5YX7o0hdmHg", false);
req.send(null);
var headers = req.getAllResponseHeaders().toLowerCase();

console.log(req.status)
console.log(headers)

CSV输出示例:

$get_child_csv = Get-ChildItem $c_path -ErrorVariable +errors | ?{ $_.PSIsContainer } | select fullname | foreach {$_.fullname} | Export-Csv ".\childitems\csv\$item.csv" -NoTypeInformation -Encoding unicode
$get_child_txt = Get-ChildItem $c_path -ErrorVariable +errors_txt | ?{ $_.PSIsContainer } | select fullname | foreach { $_.fullname } | Out-File ".\childitems\txt\$item.txt"

TXT输出:

Length
41
41
41
41

我做错了什么?

2 个答案:

答案 0 :(得分:3)

Export-CSV用于导出具有多个属性的对象。输出的格式是每行一个对象,第一行是描述ex。下面行的列/属性的标题:

Property1,Property2
11,12
21,22

由于以下代码FullName,您正尝试导出foreach { $_.FullName } | Export-CSV ... - 属性的字符串值。如下所示,字符串对象只有一个属性“长度”,这就是为什么你的CSV只包含Length标题和每个路径的长度(每行一个)的原因:

PS > Get-ChildItem | foreach {$_.fullname} | Get-Member -MemberType Properties   

   TypeName: System.String

Name   MemberType Definition       
----   ---------- ----------       
Length Property   int Length {get;}

如果您只想保存路径(单个属性/值),则不应使用Export-CSV,而应使用Out-FileSet-Content来创建普通文本文件:

Get-ChildItem $c_path | ?{ $_.PSIsContainer } | foreach { $_.fullname } | Out-File ".\childitems\txt\$item.txt"

如果您想使用有效的CSV(需要标题),则可以删除foreach {$_.fullname} |以获得此输出:

PS > Get-ChildItem $c_path -ErrorVariable +errors | ?{ $_.PSIsContainer } | select fullname | Export-Csv ".\childitems\csv\$item.csv" -NoTypeInformation -Encoding unicode

FullName
Path1
Path2

旁注:您可以将对象转换为CSV,跳过第一行(标题),然后使用Out-File等保存,如下面的示例,以获得无标题的csv文件,但实际上没有理由将CSV用于每个对象的单个属性/列/值。

PS > gci | select fullname | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1
"C:\Users\frode\3D Objects"
"C:\Users\frode\Contacts"
"C:\Users\frode\Desktop"

答案 1 :(得分:1)

<强> ANSWER

Frode F.正确地解释了为什么它没有按预期工作,但是有一种简单的方法来获取字符串数组并将它们从管道中扔到CSV中:

'first','second','third' |
     ForEach-Object {New-Object psobject -Property @{'String' = $_}} |
     Export-Csv ".\string_example.csv" -NoTypeInformation

如果您希望将此部件重新用作管道中的单线程:

%{New-Object psobject -Prop @{$propName=$_}}

(只需要提前定义$ propName或用字符串替换$ propName)

<强>说明

通过使用ForEach{New-Object},我们将获取数组中的每个字符串,并显式创建一个具有命名属性的对象,其值是管道中的字符串。

重新审视Frode F.所说的内容,Export-Csv将从传递的对象中获取属性。如果您想比较原始方式与ForEach{New-Object}的Property成员,请尝试以下代码:

$stringArray = 'first','second','third'

# Original
$stringArray |
     Get-Member -MemberType Properties

# With ForEach{New-Object}
$stringArray |
     ForEach-Object {New-Object psobject -prop @{'String' = $_}} |
     Get-Member -MemberType Properties

这导致以下结果:

   TypeName: System.String

Name   MemberType Definition       
----   ---------- ----------       
Length Property   int Length {get;}


   TypeName: System.Management.Automation.PSCustomObject

Name     MemberType   Definition                        
----     ----------   ----------                        
String   NoteProperty System.String String=first

&#34;名称&#34;中的条目字段将被Export-Csv用作标题,而&#34;定义&#34;部分将用作内容。注意&#34;定义&#34; field列出将传递的数据类型 - 原始的int和使用ForEach{New-Object}方法的字符串。