我正在使用不同方法执行多项测试,以清理大型csv文件,然后将其导入R中。
这次我在Windows中玩Powershell。
虽然比使用带管道()的cut()更好,最准确,但这个过程非常慢。
这是我的命令:
shell(shell = "powershell",
"Import-Csv In.csv |
select-object col1, col2, etc |
Export-csv new.csv")
这些是system.time()结果:
user system elapsed
0.61 0.42 1568.51
我已经看到其他一些帖子通过流媒体使用C#花了几十秒钟,但我不知道C#。
我的问题是,如何改进PowerShell命令以使其更快?
谢谢,
迭
答案 0 :(得分:3)
在csv中读取,将行转换为powershell对象以及转换回csv的开销很大。通过管道这样做也会导致它一次执行一条记录。如果切换到使用带-ReadCount参数的Get-Content,并使用-replace运算符中的正则表达式提取数据,则应该能够大大提高速度,例如:
shell(shell = "powershell",
"Get-Content In.csv -ReadCount 1000 |
foreach { $_ -replace '^(.+?,.+?),','$1' |
Add-Content new.csv")
如果磁盘读取,这将减少数量,并且-replace将作为数组运算符运行,一次执行1000条记录。
答案 1 :(得分:0)
首先,我的第一次测试是错误的,因为我之前遇到过一些错误,其他几个powershell会议仍然开放并延迟了整个过程。
这些是实数:
> system.time(shell(shell = "powershell", psh.comm))
user system elapsed
0.09 0.05 824.53
现在,正如我所说,我无法找到一个好的模式来分割我的csv文件的列。
我可能需要补充一点,它是一个混乱的文件,包含逗号,多行字段,摘要行等字段。
我尝试了其他方法,比如一个非常着名的堆栈溢出方法,它使用PowerShell中的嵌入式C#代码来拆分csv文件。
虽然它比我之前展示的更常见的方法更快,但对于这些类型的凌乱文件,结果并不准确。
> system.time(shell(shell = "powershell", psh.comm))
user system elapsed
0.01 0.00 212.96
这两种方法在大多数情况下都显示出类似的RAM消耗(~40Mb)和CPU使用率(~50%)。
因此,虽然前一种方法占用了后者的4倍,但结果的准确性,资源方面的低成本以及较少的开发时间使我认为它对于大而混乱的csv文件来说效率最高。