使用 PowerShell 对 .txt 文件的行进行排序

Lal*_*ala 0 powershell batch-file

我有一个.txt像下面这样的:

MasterCard 
R$ 66,12 

Hipercard 
R$ 7.501,98 

MasterCard 
R$ 48,19 

Hipercard 
R$ 7.742,46 

MasterCard 
R$ 48,19 

Hipercard 
R$ 5.846,14 

MasterCard 
R$ 48,19 

Hipercard 
R$ 4.210,65 

Visa
R$ 4.210,65 

MasterCard 
R$ 48,19 

Hipercard 
R$ 2.892,20 

MasterCard 
R$ 48,19 

Visa
R$ 4.210,65

Hipercard 
R$ 1.944,19 

Hipercard 
R$ 584,04 

Visa
R$ 4.210,65
Run Code Online (Sandbox Code Playgroud)

我需要一个.bat文件(可能在 PowerShell 中)按描述和值组织行,如下所示:

-----------------
MasterCard 
R$ 66,12 

MasterCard 
R$ 48,19 

MasterCard 
R$ 48,19 

MasterCard 
R$ 48,19 

MasterCard 
R$ 48,19 

MasterCard 
R$ 48,19 

----------------      
Hipercard 
R$ 7.501,98 

Hipercard 
R$ 7.742,46 

Hipercard 
R$ 5.846,14 

Hipercard 
R$ 4.210,65

Hipercard 
R$ 2.892,20 

Hipercard 
R$ 1.944,19 

Hipercard 
R$ 584,04 

--------------        
Visa
R$ 4.210,65 

Visa
R$ 4.210,65

Visa
R$ 4.210,65
Run Code Online (Sandbox Code Playgroud)

可以用.bat文件来做吗?我被困在如何开始。我正在尝试使用一个简单的命令:sort test.txt /o testout.txt

但它不起作用。


我有另一个想法。运行此命令,我可以将所有行放在同一行中:

for /f "usebackq tokens=* delims=" %%a in ("frt01.txt") do (echo(%%a)>>test.txt
for /f "usebackqdelims=" %%i in ("test.txt") do @<nul set /p"=%%i ">>"test2.txt"
del test.txt /S /Q /
Run Code Online (Sandbox Code Playgroud)

所以现在,描述和值都在一行中:

MasterCard  R$ 66,12  Hipercard  R$ 7.501,98  MasterCard  R$ 48,19  Hipercard  R$ 7.742,46  MasterCard  R$ 48,19  Hipercard  R$ 5.846,14  MasterCard  R$ 48,19  Hipercard  R$ 4.210,65  MasterCard  R$ 48,19  Hipercard  R$ 2.892,20  MasterCard  R$ 48,19  Hipercard  R$ 1.944,19  Hipercard  R$ 584,04  
Run Code Online (Sandbox Code Playgroud)

我该怎么做才能像波纹管一样?(在每个值后键入“输入”)

MasterCard  R$ 66,12  
Hipercard  R$ 7.501,98  
MasterCard  R$ 48,19  
Hipercard  R$ 7.742,46  
MasterCard  R$ 48,19  
Hipercard  R$ 5.846,14  
MasterCard  R$ 48,19  
Hipercard  R$ 4.210,65  
MasterCard  R$ 48,19  
Hipercard  R$ 2.892,20  
MasterCard  R$ 48,19  
Hipercard  R$ 1.944,19  
Hipercard  R$ 584,04  
Run Code Online (Sandbox Code Playgroud)

因为那样我可以用这个命令排序: sort test2.txt /o output.txt

我想通过这种方式做更容易。


@michael_heath 这就是我所说的:

Hipercard   R$    584,04
Hipercard   R$  1.944,19
Hipercard   R$  2.892,20
Hipercard   R$  4.210,65
Hipercard   R$  5.846,14
Hipercard   R$  7.501,98
Hipercard   R$  7.742,46
------------------------
MasterCard  R$     48,19
MasterCard  R$     48,19
MasterCard  R$     48,19
MasterCard  R$     48,19
MasterCard  R$     48,19
MasterCard  R$     66,12
------------------------
Visa        R$     48,19
Visa        R$     48,19
Visa        R$     48,19
------------------------
Run Code Online (Sandbox Code Playgroud)

Mat*_*sen 5

在对数据进行排序之前,您需要对其进行解析。您可以使用带有模板的ConvertFrom-Stringcmdlet来执行此操作:

$Template = @'
{CardProvider*:MasterCard}
R$ {Amount:66,12}

{CardProvider*:Hipercard}
R$ {Amount:7.501,98}

{CardProvider*:Visa}
R$ {Amount:4.210,65}

'@

$Transactions = Get-Content path\to\file.txt |ConvertFrom-String -TemplateContent $Template
Run Code Online (Sandbox Code Playgroud)

$Transactions变量现在将包含一个对象数组,每个对象都有一个CardProvider和一个Amount属性。要按提供商然后按数量排序,我们可以执行以下操作:

# Define output file name
$OutputFile = 'output.txt'
# Group by card type first
$Transactions |Group-Object CardProvider |ForEach-Object {
    # Write seperator to output file:
    '----------------' |Add-Content -Path $OutputFile 
    # Now we sort each group of cards by descending amount
    $_.Group |Sort-Object {$_.Amount -replace '\.' -replace ',','.' -as [decimal]} -Descending |ForEach-Object {
        # Finally write the contents to file again
        $_.CardProvider,"R$ $($_.Amount)","" |Add-Content -Path $OutputFile
    }
}
Run Code Online (Sandbox Code Playgroud)