PowerShell Import-CSV to Export-CSV,类型转换为

时间:2017-05-19 18:28:25

标签: powershell csv import-csv

我得到一堆制表符分隔的文件,我想将它们转换为逗号分隔的文件。我还需要文件中的两列" 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

期间

2 个答案:

答案 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的实例,并且没有值需要, - 封闭 - 这在此特定情况下是合理的场景。

  • 我选择了UTF-8作为上面的输出编码,因为"..."默认为传统的,特定于文化的“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