如何使用Powershell导出到“非标准”CSV

时间:2015-07-30 19:56:15

标签: powershell

我需要使用以下格式转换文件:

  

2015.03.27,09:00,1.08764,1.08827,1.08535,1.08747,8941   2015.03.27,10:00,1.08745,1.08893,1.08604,1.08762,7558

这种格式

  

2015.03.27,1.08764,1.08827,1.08535,1.08747,1
  2015.03.27,1.08745,1.08893,1.08604,1.08762,1

我从这段代码开始,但看不到如何实现完全转换:

    Import-Csv in.csv -Header Date,Time,O,H,L,C,V | Select-Object Date,O,H,L,C,V | Export-Csv -path out.csv -NoTypeInformation
    (Get-Content out.csv) | % {$_ -replace '"', ""} | out-file -FilePath out.csv -Force -Encoding ascii

输出

  

日期,O,H,L,C,V
  2015.03.27,1.08745,1.08893,1.08604,1.08762,8941
  2015.03.27,1.08763,1.08911,1.08542,1.08901,7558

之后我需要

  
      
  • 删除标题(我尝试了无法识别的-NoHeader)
  •   
  • 用1替换最后一列。
  •   

如何尽可能简单地做到这一点(如果可能的话,不绕过每一行)

更新:最后我简化了要求。我只需要用常量替换最后一列。

1 个答案:

答案 0 :(得分:2)

好的,这个可能是一个巨大的单行...虽然出于理智的原因,我会在管道上换行。

Import-Csv in.csv -header Date,Time,O,H,L,C,V|select * -ExcludeProperty time|
    %{$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_}|
    ConvertTo-Csv -NoTypeInformation|
    select -skip 1|
    %{$_ -replace '"'}|
    Set-Content out.csv -encoding ascii

基本上我导入CSV,排除时间列,将日期列转换为实际的[datetime]对象,然后以所需格式将其转换回来。然后我将修改后的对象(使用新格式化的日期)向下传递到ConvertTo-CSV,然后跳过第一行(您不想要的标题),然后从中删除引号,最后输出到文件Set-Content(快于Out-File

修改:刚刚看到您的更新...要做到这一点我们只需在修改日期列的同时添加$_.v=1;,将最后一列更改为1 ...

        %{$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_}|

修改了整个脚本:

Import-Csv in.csv -header Date,Time,O,H,L,C,V|select * -ExcludeProperty time|
    %{$_.date = [datetime]::ParseExact($_.date,"yyyy.MM.dd",$null).tostring("yyMMdd");$_.v=1;$_}|
    ConvertTo-Csv -NoTypeInformation|
    select -skip 1|
    %{$_ -replace '"'}|
    Set-Content out.csv -encoding ascii

哦,这还有一个额外的好处,就是不必读取文件,将文件写入驱动器,读取该文件,然后再将文件写入驱动器。