我需要使用以下格式转换文件:
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替换最后一列。
如何尽可能简单地做到这一点(如果可能的话,不绕过每一行)
更新:最后我简化了要求。我只需要用常量替换最后一列。
答案 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
哦,这还有一个额外的好处,就是不必读取文件,将文件写入驱动器,读取该文件,然后再将文件写入驱动器。