Powershell,R,Import-Csv,select-object,Export-csv

时间:2014-05-31 20:37:36

标签: r powershell csv

我正在使用不同方法执行多项测试,以清理大型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命令以使其更快?

谢谢,

2 个答案:

答案 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文件来说效率最高。