【发布时间】:2017-02-10 05:00:15
【问题描述】:
我有一个工作脚本,其目标是在导入 Oracle 之前解析数据文件中的格式错误的行。要处理超过 100 万行、8 列的 450MB csv 文件,需要花费 2.5 小时多一点的时间,并且会最大化单个 CPU 内核。小文件快速完成(几秒钟)。
奇怪的是,具有相似行数和 40 列的 350MB 文件只需要 30 分钟。
我的问题是文件会随着时间的推移而增长,而 2.5 小时占用 CPU 并不好。谁能推荐代码优化?类似标题的帖子推荐了本地路径 - 我已经在这样做了。
$file = "\Your.csv"
$path = "C:\Folder"
$csv = Get-Content "$path$file"
# Count number of file headers
$count = ($csv[0] -split ',').count
# https://blogs.technet.microsoft.com/gbordier/2009/05/05/powershell-and-writing-files-how-fast-can-you-write-to-a-file/
$stream1 = [System.IO.StreamWriter] "$path\Passed$file-Pass.txt"
$stream2 = [System.IO.StreamWriter] "$path\Failed$file-Fail.txt"
# 2 validation steps: (1) count number of headers is ge (2) Row split after first col. Those right hand side cols must total at least 40 characters.
$csv | Select -Skip 1 | % {
if( ($_ -split ',').count -ge $count -And ($_.split(',',2)[1]).Length -ge 40) {
$stream1.WriteLine($_)
} else {
$stream2.WriteLine($_)
}
}
$stream1.close()
$stream2.close()
示例数据文件:
C1,C2,C3,C4,C5,C6,C7,C8 ABC,000000000000006732,1063,2016-02-20,0,P,估计,2015473497A10 ABC,000000000000006732,1110,2016-06-22,0,P,估计,2015473497A10 ABC,,2016-06-22,,201501 ,,,,,,,, ABC,000000000000006732,1135,2016-08-28,0,P,估计,2015473497B10 ABC,000000000000006732,1167,2015-12-20,0,P,估计,2015473497B10【问题讨论】:
-
输入文件的几行示例怎么样?以及你想要做什么的描述?
-
获取内容超慢。使用 IO.StreamReader。还要为输出使用不同的硬盘驱动器或在 StreamWriter 构造函数中指定一个大的写入缓冲区。
-
现在这就是我所希望的那种建议!好人,干杯。
-
您能否在代码的每个部分周围放置一些 Measure-Command {
} 块以查看延迟在哪里?即:是加载,文件写入等。 -
我曾想过尝试那个 Simon,但我认为它必须是 If 语句。读取文件需要一段时间,但观看资源监视器我可以看到光盘写入在片刻后开始。我没有考虑过它可能是一边阅读一边写作。我会坚持一个措施...不能伤害!干杯。
标签: performance powershell csv if-statement