Powershell添加标题记录

时间:2014-06-24 14:05:32

标签: powershell append prepend

我在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) 

2 个答案:

答案 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()