3

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

4

2 回答 2

2

Export-CSV 总是"..."在输出字段值周围添加(本身)不是问题

  • CSV 数据格式没有数据类型的内在概念双引号仅用于起字段值(例如,这是嵌入字符的字段值的语法要求,)。

  • 例如,Excel仅根据其内容推断列的数据类型,无论该内容是否用双引号引起来。

    • 然而,内容解释是文化感知的(locale-aware)
  • 相比之下,PowerShellImport-Csv 从不解释数据并将所有字段值作为字符串返回。

根据将处理 CSV 的环境中的活动区域性,您有两种选择:

  • 对于像de-DE(Germany) 这样的区域性,其中,(comma) 而不是.(dot, period) 用作小数点,;而不是,用作列表分隔符:

    • 在目标区域性生效(使用 验证Get-Culture)的情况下,使用Export-Csv -UseCulture
      -UseCulture自(至少)v2 [1]起可用 )。谢谢,LotPings
    • 或者,使用类似的东西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 作为上面的输出编码,因为Set-Content默认为传统的、特定于文化的“ANSI”代码页 - 根据需要进行调整。

[1] 通常,如果 cmdlet 的帮助主题中的参数描述未提及引入它的特定版本,则意味着它自 v2.0 以来就已存在。您现在可以在GitHub 上浏览旧版本的文档 - 直到 v3 -只需键入T或单击Find file并开始键入 cmdlet/概念性帮助主题名称。

于 2017-05-19T21:03:01.010 回答
0

Export-CSV无论类型如何,都会添加引号。可能您可以做的唯一方法是再次加载文件并使用正则表达式删除这些引号:

(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\$_"
}

注意:您可能需要-EncodingSet-Contentcmdlet 设置 !

于 2017-05-19T18:42:22.557 回答