我得到一堆制表符分隔的文件,我想将它们转换为逗号分隔的文件。我还需要文件中的两列" Date"和" Value1",所以我删除了其余的列。
Date Value1 Value2 Value3 Value4 Sensor
08.07.2010 115,28 115,45 115,45 115,28 100
07.07.2010 115,34 115,32 115,34 115,25 85
06.07.2010 115,23 115,74 115,74 115,20 203
其工作原理如下:
(get-ChildItem -Path '*.txt').name | ForEach-Object {
Import-Csv -Path $_ -Delimiter "`t" |
Select-Object -Property Date,Value1 |
Export-Csv "out\$_"
}
不幸的是,在源文件中,逗号用作小数点分隔符。所以我得到这些文件,其中Value1被解释为字符串:
"Date","Value1"
"24.02.2017","30,18"
"23.02.2017","30,20"
"22.02.2017","30,18"
"21.02.2017","30,18"
"20.02.2017","30,17"
如何将列的数据类型设置为数字?在Import-CSV
?
答案 0 :(得分:2)
Export-CSV
总是在输出字段值周围添加"..."
是而不是(本身)一个问题:
CSV数据格式具有无 数据类型的内在概念 ,并且仅使用双引号包含字段值(例如,这是对具有嵌入式,
字符的字段值的语法要求。)
Excel,例如,仅从内容 推断列的数据类型,无论该内容是否用双引号括起来或不。
相比之下, PowerShell的Import-Csv
从不解释数据并将所有字段值作为字符串返回强>
根据环境中的活动文化,CSV将在中处理,您有两种选择:
对于de-DE
(德国)这样的文化,其中,
(逗号)而不是.
(点,句号)用作小数点,{ {1}}而不是;
用作列表分隔符:
,
验证),请使用Get-Culture
Export-Csv -UseCulture
自(至少)v2 [1] 以来可用
)。谢谢,LotPings -UseCulture
对于英语文化(或使用Export-Csv -Delimiter ([cultureinfo]::GetCultureInfo('de-DE').TextInfo.ListSeparator)
作为小数点的任何其他文化):
.
个实例替换为,
- 请参阅下文。要用.
替换,
个实例,以下命令只会使用字符串操作:
.
注意:为简单起见,该命令假定Get-ChildItem -Path *.txt | ForEach-Object {
Get-Content -LiteralPath $_.FullName | ForEach-Object {
($_ -split '\t')[0,1] -replace ',', '.' -join ','
} |
Set-Content -Encoding utf8 "out/$($_.Name)"
}
列值不包含Date
的实例,并且没有值需要,
- 封闭 - 这在此特定情况下是合理的场景。
"..."
默认为传统的,特定于文化的“ANSI”代码页 - 根据需要进行调整。 [1]通常,如果cmdlet的帮助主题中的参数描述未提及引入它的特定版本,则意味着它自v2以来就存在。您现在可以浏览旧版本的文档 - 直到v3 - GitHub - 只需输入Set-Content
或点击T
并开始输入cmdlet /概念帮助 - 主题名称。
答案 1 :(得分:0)
Export-CSV
无论类型如何都会添加引号。可能唯一的方法是再次加载文件并使用 regex 删除这些引号:
(get-ChildItem -Path '*.txt').name | ForEach-Object {
Import-Csv -Path $_ -Delimiter "`t" |
Select-Object -Property Date,Value1 |
Export-Csv "out\$_"
(Get-Content $_) -replace ',"(\d+),(\d+)"$', ',$1.$2' | Set-Content "out\$_"
}
注意:您可能需要为-Encoding
cmdlet设置Set-Content
!