我无法理解为什么我的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
我做错了什么?
答案 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-File
,Set-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}
方法的字符串。