比较两个列表并使用powershell制作报告

时间:2021-01-25 21:16:10

标签: powershell

我正在尝试使用 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)
    }

}

1 个答案:

答案 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"