我正在尝试使用 Powershell 为交易系统制作报告。 我有一个包含我当前代码的 txt 文件 (owned.txt):
<块引用>DNO.OL
EQNR.OL
还有另一个包含买入/卖出信号的 txt 文件 (signals.txt):
<块引用>DNO.OL,Sell,25.01.2021,7.1580
DSV.CO,买入,25.01.2021,982.4000
如果signals.txt 中的一行包含一个带有“Sell”的股票代码(eks“DNO.OL”),该代码也在owned.txt 中。我想将signals.txt中的那一行添加到报告中,并从owned.txt中删除那个代码(eks“DNO.OL”)。
如果signals.txt 中的某一行包含一个带有“Buy”的代码(eks“DVS.CO”),并且该代码不在owned.txt 中。我希望将来自signals.txt的那一行添加到报告中,并将代码添加(eks“DVS.CO”)到owned.txt文件中。
我已开始使用此代码,但它无法正常工作。
$report = "C:\temp\report.txt"
$ToDaySignals = Get-Content "C:\temp\signals.txt"
$OwnedList = "C:\temp\owned.txt"
ForEach ($line in $ToDaySignals)
{
$part = $line -split ","
If ( ((Get-Content $OwnedList) -notcontains $part[0]) -and (($part[1]) -eq "Buy") )
{
"Buy: " + $line | Out-file $report -Append
$part[0] | Out-File $OwnedList -Encoding utf8 -Append
}
If ( ((Get-Content $OwnedList) -contains $part[0]) -and (($part[1]) -eq "Sell") )
{
"Sell: " + $line | Out-file $report -Append
Set-Content -Path $OwnedList -Value (get-content -Path $OwnedList | Select-String -Pattern $part[0] -NotMatch)
}
}
答案 0 :(得分:0)
首先,我想建议您摆脱使用纯文本文件的心态。如果您使用对象,这将变得更加容易和干净。您的信号文件似乎已经是没有标题的 CSV 文件。为了帮助您实现既定目标,我将坚持使用基于文本的报告输出,但我敦促您考虑替代方案。还有几个重复的、可能开销很大的命令,例如 Get-Content、Set-Content 和 Out-File。最好每次都读取一次,建立所有最终结果然后只输出一次。
$reportfile = "C:\temp\report.txt"
# Capture all of owned.txt in a string array
$owned = Get-Content "C:\temp\owned.txt" -ReadCount 1
# Import TodaySignals as a CSV
$ToDaySignals = Import-Csv "C:\temp\signals.txt" -Header Ticker,Signal,Date,Amount
# Capture every line that is output (only Buy: ... and Sell: ... lines will be output)
$report = foreach($line in $ToDaySignals)
{
if($line.Signal -eq 'Buy' -and $owned -notcontains $line.ticker)
{
"Buy: {0},{1},{2},{3}" -f $line.Ticker,$line.Signal,$line.Date,$line.Amount
$owned += $line.Ticker
}
elseif($line.Signal -eq 'Sell' -and $owned -contains $line.ticker)
{
"Sell: {0},{1},{2},{3}" -f $line.Ticker,$line.Signal,$line.Date,$line.Amount
$owned = $owned | Where-Object {$_ -ne $line.Ticker}
}
}
Set-Content -Value $report -Path $reportfile
Set-Content -Value $owned -Path "C:\temp\owned.txt"