我在SSIS中有一个创建三个文件的进程。
Header.txt work.txt Trailer.txt
然后我使用执行流程任务来调用我的Powershell脚本。我基本上需要获取work.txt文件并在其前面加上标题记录(同时保持work.txt中原始值的完整性),然后附加预告片记录(使用总行数计算等)。
目前我有:
Set-Location "H:\Documentation\Projects\CVS\StageCVS"
Clear-Content "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility"
Get-Content Header.txt, work.txt, Trailer.txt|out-file "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility" -Confirm
这在我只有1000行的测试中很好,但是现在我有67,000行,这个过程需要永远。
我正在查看Add-Content cmdlet,但我找不到添加标头的示例。有人可以协助使用语法转到文件的第一行,然后在第一行之前添加内容吗?
提前多多感谢!
只是为了澄清:我想建立work.txt文件。大多数数据已经存在,因此我认为副本更有意义,而不是将其全部重写为新文件。所以理论上我会创建所有三个文件。将工作文件复制到workfile.txt。将标头添加到工作文件,将预告片附加到工作文件,重命名工作文件。
更新 这似乎适用于预告片。
Set-Location "H:\Documentation\Projects\CVS\StageCVS"
#Clear-Content "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility"
Copy-Item work.txt workfile.txt
#Get-Content Header.txt, work.txt, Trailer.txt|out-file "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility"
Add-Content workfile.txt -value (get-content Trailer.txt)
更新
也尝试过:
Set-Location "H:\Documentation\Projects\CVS\StageCVS"
$header = "H:\Documentation\Projects\CVS\StageCVS\Header.txt"
#Clear-Content "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility.txt"
Copy-Item work.txt workfile.txt
#(Get-Content Header.txt, work.txt, Trailer.txt -readcount 1000)|Set-Content "H:\Documentation\Projects\CVS\StageCVS\CVSMemberEligibility"
Add-Content workfile.txt -value (get-content Trailer.txt)
.\workfile.txt = $header + (gc workfile.txt)
答案 0 :(得分:1)
这似乎很容易,但实际情况是它不是由于底层文件系统。您将需要一个文件缓冲区或临时文件,或者如果您真的很勇敢,您可以查看扩展文件并转置字符。正如这个人在C#中所做的那样。
在C#中将文本插入现有文件,没有临时文件或内存缓冲区 http://www.codeproject.com/Articles/17716/Insert-Text-into-Existing-Files-in-C-Without-Temp
答案 1 :(得分:1)
因此事实证明out-file和get-content的性能不是很强。我发现运行5000记录结果集并写入/读取数据需要5分钟以上。
当我研究Powershell的一些不同的性能选项时,我发现了一个streamwriter .NET方法。对于相同的过程,这在15秒内完成。
由于我在生产环境中的结果集是70-90000条记录,这就是我采用的方法。
这就是我所做的:
[IO.Directory]::SetCurrentDirectory("H:\Documentation\Projects\CVS\StageCVS")
Set-Location "H:\Documentation\Projects\CVS\StageCVS"
Copy-Item ".\ELIGFINAL.txt" H:\Documentation\Projects\CVS\StageCVS\archive\ELIGFINAL(Get-Date -f yyyyMMdd).txt
Clear-Content "H:\Documentation\Projects\CVS\StageCVS\ELIGFINAL.txt"
Copy-Item work.txt workfile.txt
Add-Content workfile.txt -value (get-content Trailer.txt)
$work = ".\workfile.txt"
$output = "H:\Documentation\Projects\CVS\StageCVS\ELIGFINAL.txt"
$readerwork = [IO.File]::OpenText("H:\Documentation\Projects\CVS\StageCVS\workfile.txt")
$readerheader = [IO.File]::OpenText("H:\Documentation\Projects\CVS\StageCVS\Header.txt")
try
{
$wStream = New-Object IO.FileStream $output ,'Append','Write','Read'
$writer = New-Object System.IO.StreamWriter $wStream
#$write-host "OK"
}
finally
{
}
$writer.WriteLine($readerheader.ReadToEnd())
$writer.flush()
$writer.WriteLine($readerwork.ReadToEnd())
$readerheader.close()
$readerwork.close()
$writer.flush()
$writer.close()