powershell 删除文本文件每行的前4个字符

xggvc2p6  于 2023-02-04  发布在  Shell
关注(0)|答案(4)|浏览(211)

我有一个文件,里面有很多这样的行,总是有相同数量的分号,并且在第一个分号之前总是有一个3个字符的字符串。
逆转录酶2; SS1234567;红色库存; 2021年6月13日;2021年6月14日; 154;出局;
放射治疗2号;红色库存; 2021年5月4日;二○二一年六月十四日;一四七二年;出局;
逆转录酶2; FF1234567;红色库存; 2021年5月4日;二○二一年六月十四日;一四七二年;出局;
RT2; LL1234567;红色库存; 2021年5月13日;二○二一年六月十四日;一四七二年;出局;
我想删除开始3字符串和分号从每一行。
这就是我如何拉入文件,它充满了空行和行我需要删除

#import the file removing the first row and removing blank rows
$inFile = Get-Content -Path ($InFileDir + $InFileName)|Select-Object -Skip 1|? {$_.trim() -ne "" }

# Removes the (12334 rows affected) line that's added by sql
$inFile = $inFile|Where-Object {$_ -notlike '(*)'}

# Source file is two different sql table exports appended to each other, store the different headers
$header1 = 'RT1;Polref;Tranaction;Eff Dte;Process Dte;Fund;Movement;'
$header2 = 'RT3;Polref;Tranaction;Eff Dte;Process Dte;Fund;Qty;Amt;'

#Get some file positions
$RowBeforeheader2Index = $InFile.IndexOf($header2) -1
$header1Index = $InFile.IndexOf($header1)
$header2Index = $InFile.IndexOf($header2)
$LastRow = $inFile.Length -1

$outFile[$header1Index..$RowBeforeheader2Index]

foreach ($row in $outFile)
{
    //perform a substring on the row and add to $var
}

$var|Out-file 'C:\temp\output.txt'

我不知道如何填充foreach循环以获得我想要的结果。(在这个例子中,我只是将其命名为$var for ......我不是那么缺乏想象力)
编辑:
最后我将$var更改为列表,并在foreach循环中使用了以下代码

$var = New-Object System.Collections.Generic.List[System.Object]

foreach($row in $outFile)
{
    $var.Add($row.Substring(4))
}
gg0vcinb

gg0vcinb1#

假设可以删除固定数量的字符,并且每行至少有4个字符,那么只需对字符串数组(行)调用.Substring()即可:

# Sample input
$outFile = 'RT2;SS1234567', 'RT2;SS1234568', 'RT2;SS1234569'

# Remove the first 4 characters from each line (array element).
# (Use $var = ... to assign the output to a variable).
$outFile.Substring(4)

注意,即使$outFile是一个 * 数组 *,.Substring()方法也是在 * 每个元素 * 上调用的,这是一个PowerShell特性,称为member-access enumeration

68de4m5k

68de4m5k2#

试试这个-

$data = @"
RT2;SS1234567;INV RED;13.06.2021;14.06.2021;154;Out;
RT2;XX1234567;INV RED;04.05.2021;14.06.2021;1472;Out;
RT2;FF1234567;INV RED;04.05.2021;14.06.2021;1472;Out;
RT2;LL1234567;INV RED;13.05.2021;14.06.2021;1472;Out;
"@ | ConvertFrom-Csv -Delimiter ";" -Header @("col1","col2", "col3", "col4", "col5", "col6", "col7")

$data | Select-Object * -ExcludeProperty col1 | ConvertTo-Csv | Select-Object -Skip 2 | Set-Content $env:USERPROFILE\Desktop\output.csv

注意-如果ConvertTo-Csv生成额外的列**#TYPE Selected.System.Management.Automation.PSCustomObject**,则使用Select-Object -Skip 2,否则可以使用Select-Object -Skip 1

wgeznvg7

wgeznvg73#

有很多方法可以做到这一点。如果你的操作真的像删除第一列那么简单,你可以这样做。假设你的例子中$outFile的内容与你的清单相对应,并且$var = @()已经在你的脚本中设置好了,你可以在foreach循环中放入以下内容:

$null,$row = $row -split ';' # Turn the string into an array and dump the first element.
$var += $row -join ';' # Turn the array into a string using ; as delimiter

$var的内容应该如下所示:

SS1234567;INV RED;13.06.2021;14.06.2021;154;Out;
XX1234567;INV RED;04.05.2021;14.06.2021;1472;Out;
FF1234567;INV RED;04.05.2021;14.06.2021;1472;Out;
LL1234567;INV RED;13.05.2021;14.06.2021;1472;Out;
wljmcqd8

wljmcqd84#

  • -更换
    是删除多行文字每行中字符数的最简单方法。
$content = $inFile = Get-Content -Path ($InFileDir + $InFileName)|Select-Object -Skip 1    
$content -replace "(?m)^.{4}"

多行模式由***m***标志启用,因此^和$将多次匹配字符串的开头和结尾。(除以\n)

相关问题