Powershell 导出Csv会发出长度而不是值

Powershell 导出Csv会发出长度而不是值,powershell,Powershell,我想读取一个CSV文件并输出一个只有一(1)个字段的CSV文件。我试图创建一个简明的示例 PS C:\src\powershell> Get-Content .\t.csv field1,field2,field3 1,2,3 4,55,6 7,888,9 PS C:\src\powershell> Import-Csv -Path .\t.csv | ` >> ForEach-Object { >> $_.field2 ` >>

我想读取一个CSV文件并输出一个只有一(1)个字段的CSV文件。我试图创建一个简明的示例

PS C:\src\powershell> Get-Content .\t.csv
field1,field2,field3
1,2,3
4,55,6
7,888,9

PS C:\src\powershell> Import-Csv -Path .\t.csv | `
>>     ForEach-Object {
>> $_.field2 `
>>     } | `
>>     Export-Csv -Path .\x.csv -NoTypeInformation
>>
问题是field2的长度写入导出的CSV文件。我希望字段标题为“field2”,值为原始CSV文件中的值。此外,我只想引用他们需要的地方;不是到处都是

我读过,也读过。但这些似乎并没有解决如何生成一个实际的CSV文件,其中包含一个头和一个字段值

PS C:\src\powershell> get-content .\x.csv
"Length"
"1"
"2"
"3"
CSV对象使用每行中的注释属性来存储其字段,因此我们需要使用
Select object
cmdlet(别名:
Select
)过滤每行对象并只保留所需的字段,该cmdlet一次处理整个CSV对象:

Import Csv 1.Csv |选择field2 | Export Csv 2.Csv-notype信息
注意,如果行尾以
{
,或
)结尾,则无需转义行尾 可以指定几个字段:
选择字段2,字段3


要去除不需要的双引号,一般多字段情况:

导入Csv 1.Csv|
选择字段2|
%{
$\.PSObject.Properties |%{$\.value=$\.value-replace'',[char]1}
$_
} |
转换为Csv-NoTypeInformation|
%{$\-replace'(\S*?)','$1'-replace'\x01','''''''}|
输出文件2.csv-编码ascii
简化的一个现场案例:

导入Csv 1.Csv|
选择字段2|
%{
$\.field2=$\.field2-替换“”,[char]1
$_
} |
转换为Csv-NoTypeInformation|
%{$\-replace'(\S*?)','$1'-replace'\x01','''''''}|
输出文件2.csv-编码ascii
通过临时用控制字符代码01替换字段中的嵌入引号,解决了一个棘手的问题(在一个典型的未断开的文本文件中,只有几个可以使用:09/tab、0A/linefeed、0D/carries return).

CSV对象使用每行中的注释属性来存储其字段,因此我们需要使用
Select-object
cmdlet(别名:
Select
)筛选每行对象并只保留所需的字段,该cmdlet一次处理整个CSV对象:

Import Csv 1.Csv |选择field2 | Export Csv 2.Csv-notype信息
注意,如果行尾以
{
,或
)结尾,则无需转义行尾 可以指定几个字段:
选择字段2,字段3


要去除不需要的双引号,一般多字段情况:

导入Csv 1.Csv|
选择字段2|
%{
$\.PSObject.Properties |%{$\.value=$\.value-replace'',[char]1}
$_
} |
转换为Csv-NoTypeInformation|
%{$\-replace'(\S*?)','$1'-replace'\x01','''''''}|
输出文件2.csv-编码ascii
简化的一个现场案例:

导入Csv 1.Csv|
选择字段2|
%{
$\.field2=$\.field2-替换“”,[char]1
$_
} |
转换为Csv-NoTypeInformation|
%{$\-replace'(\S*?)','$1'-replace'\x01','''''''}|
输出文件2.csv-编码ascii

通过临时用控制字符代码01替换字段中的嵌入引号,解决了一个棘手的问题(在一个典型的未断开的文本文件中,只有几个可以使用:09/tab、0A/linefeed、0D/carries return).

根据WOxxOm的回答,
选择对象
是从输入和管道到输出中仅选择字段的最佳方式

关于引号,这是PowerShell的一个已知(令人沮丧)问题。将
指定为分隔符没有帮助。 我已经通过使用
converttocsv
Foreach对象
替换解决了这个问题。如果您的数据包含引号,则替换需要更加复杂

Import-Csv .\1.csv |
Select-Object field2 |
ConvertTo-Csv -NoTypeInformation |
ForEach-Object {$_ -replace '"',''} |
Out-File .\2.csv

根据WOxxOm的回答,
Select Object
是从输入和管道到输出中只选择字段的最佳方法

关于引号,这是PowerShell的一个已知(令人沮丧)问题。将
指定为分隔符没有帮助。 我已经通过使用
converttocsv
Foreach对象
替换解决了这个问题。如果您的数据包含引号,则替换需要更加复杂

Import-Csv .\1.csv |
Select-Object field2 |
ConvertTo-Csv -NoTypeInformation |
ForEach-Object {$_ -replace '"',''} |
Out-File .\2.csv

谢谢@gms0ulman。这确实有效,但是,正如你所提到的,删除报价在很多情况下都不起作用。谢谢@gms0ulman。这确实有效,但是,正如你所提到的,删除报价在很多情况下都不起作用。我相信你已经做到了……一(1)字段。将其转换为通用CSV使用的完整解决方案需要一些周期。确实应该是Powershell提供了控制引用的开关。有些人可能希望或需要引用每个字段。我希望看到省略引用,除非该字段包含引号字符或分隔符。我相信您有它…一(1)字段。将其转换为通用CSV使用的完整解决方案需要一些周期。确实应该是Powershell提供了控制引用的开关。有些人可能希望或需要引用每个字段。我希望看到省略引用,除非字段包含引号字符或分隔符。