Powershell 导出Csv会发出长度而不是值
我想读取一个CSV文件并输出一个只有一(1)个字段的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 ` >>
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提供了控制引用的开关。有些人可能希望或需要引用每个字段。我希望看到省略引用,除非字段包含引号字符或分隔符。