首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Powershell,R,Import-Csv,select-object,Export-csv

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

Stack Overflow用户
提问于 2014-06-01 04:37:36
回答 2查看 1.1K关注 0票数 1

我正在使用不同的方法执行几个测试,以清理一个大的csv文件,然后将其导入R。

这一次,我在Windows中使用Powershell。

虽然与使用cut()和pipe()相比,它工作得更好,也更准确,但这个过程慢得可怕。

这是我的命令:

代码语言:javascript
复制
shell(shell = "powershell", 
              "Import-Csv In.csv | 
               select-object col1, col2, etc | 
               Export-csv new.csv")

下面是system.time()的结果:

代码语言:javascript
复制
   user  system elapsed 
   0.61    0.42 1568.51 

我看过其他一些通过流媒体使用C#的帖子,只需要几十秒,但我不知道C#。

我的问题是,如何改进PowerShell命令以使其更快?

谢谢,

迭戈

EN

回答 2

Stack Overflow用户

发布于 2014-06-01 05:24:53

在读取csv、将行转换为powershell对象以及转换回csv时,有大量的开销。通过管道这样做也会导致它一次只做一条记录。如果您切换到使用带有-ReadCount参数的Get-Content,并在-replace运算符中使用正则表达式提取数据,则应该能够大大加快速度,例如:

代码语言:javascript
复制
shell(shell = "powershell", 
              "Get-Content  In.csv -ReadCount 1000 | 
               foreach { $_ -replace '^(.+?,.+?),','$1' | 
               Add-Content new.csv")

这将减少磁盘读取的数量,并且-replace将充当数组操作符,一次处理1000条记录。

票数 3
EN

Stack Overflow用户

发布于 2014-06-02 18:29:06

首先也是最重要的,我的第一个测试是错误的,因为我之前有一些错误,powershell的其他几个会话仍然开放,并延迟了整个过程。

以下是真实的数字:

代码语言:javascript
复制
> system.time(shell(shell = "powershell", psh.comm))
   user  system elapsed 
   0.09    0.05  824.53 

现在,正如我所说的,我找不到一个好的模式来拆分csv文件的列。

我可能需要补充一点,它是一个杂乱的文件,包含逗号、多行字段、摘要行等字段。

我尝试了其他方法,比如在堆栈溢出中非常著名的一种方法,它使用PowerShell中的嵌入式C#代码来拆分csv文件。

虽然它比我之前展示的更常见的方法更快,但对于这些类型的混乱文件,结果并不准确。

代码语言:javascript
复制
> system.time(shell(shell = "powershell", psh.comm))
   user  system elapsed 
   0.01    0.00  212.96 

这两种方法显示出相似的RAM消耗(~40Mb)和CPU使用率(~50%)。

因此,虽然前一种方法花费的时间是后一种方法的4倍,但结果的准确性,低成本的资源,以及更少的开发时间,使我认为对于大而杂乱的csv文件,它是最有效的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23974358

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档