使用 powershell 添加两个断行

Adding two broken rows using powershell

我有一个文件,第一行有 header,其余行有其他数据。我想用 header.

检查所有行的数据是否相等

例如:如果 header 有 10 count 那么我希望所有剩余的行每个都有 10 数据,这样加载数据时就不会出错。

假设在 56 行中只有 5 数据 each.So,在这种情况下我想合并这两行。

我的预期输出是(第 5 行有合并数据)

file.So的很多行中可能有这样的易碎数据,我只想扫描整个文件,当看到这种情况时会合并两行。

所以,我尝试使用:

$splitway=' '
$firstLine = Get-Content -Path $filepath -TotalCount 1
$firstrowheader=$firstLine.split($splitway,System.StringSplitOptions]::RemoveEmptyEntries)
$requireddataineachrow=$firstrowheader.Count
echo $requireddataineachrow

上面的代码会给我 10 因为我的 header 有 10 个数据。

For ($i = 1; $i -lt $totalrows; $i++) {
   $singleline=Get-Content $filepath| Select -Index $i
   $singlelinesplit=$singleline.split($splitway,[System.StringSplitOptions]::RemoveEmptyEntries)
   if($singlelinesplit.Count -lt $requireddataineachrow){
     $curr=Get-Content $filepath| Select -Index $i 
     $next=Get-Content $filepath| Select -Index $i+1 
     Write-Host (-join($curr, " ", $next))
   } 
   echo $singlelinesplit.Count
} 

我测试过使用 Write-Host (-join($curr, " ", $next)) 连接两行,但它没有给出正确的输出。

echo $singlelinesplit.Count 显示正确结果:

我的全部数据是:

billing   summary_id  offer_id   vendor_id  import_v   system_ha  rand_dat  mand_no  sad_no   cad_no
11        23             44       77        88         99         100       11        12        500
1111      2333           4444    6666       7777777   8888888888   8888888888888  9999999999 1111111111111 2000000000
33333      444444     As per new account ddddddd gggggggggggg wwwwwwwwwww bbbbbbbbbbb qqqqqqqqqq rrrrrrrrr 5555555
22 33 44 55 666<CR>
42 65 66 55  244
11        23             44       76        88         99         100       11        12        500
1111      2333           new document    664466       7777777   8888888888   8888888888888  9999999999 111111144111 200055000

如果需要,我的整个代码是:

cls
$filepath='D:\test.txt'
$splitway=' '


$totalrows=@(Get-Content $filepath).Length

write-host $totalrows.gettype()

$firstLine = Get-Content -Path $filepath -TotalCount 1

$firstrowheader=$firstLine.split($splitway,[System.StringSplitOptions]::RemoveEmptyEntries)

$requireddataineachrow=$firstrowheader.Count

For ($i = 1; $i -lt $totalrows; $i++) {
   $singleline=Get-Content $filepath| Select -Index $i
   $singlelinesplit=$singleline.split($splitway,[System.StringSplitOptions]::RemoveEmptyEntries)
   if($singlelinesplit.Count -lt $requireddataineachrow){
     $curr=Get-Content $filepath| Select -Index $i 
     $next=Get-Content $filepath| Select -Index $i+1 
     Write-Host (-join($curr, " ", $next))
   } 
   echo $singlelinesplit.Count
} 

更新:似乎字符串 <CR> 的实例是输入文件的 verbatim 部分,在这种情况下以下解决方案应该足够了:

(Get-Content -Raw sample.txt) -replace '<CR>\s*', ' ' | Set-Content sample.txt

这是一个基于以下假设的解决方案:

  • <CR> 只是一个 占位符 以帮助可视化输入文件中的 实际换行符

  • 只有比 header 行 列的数据行需要修复(正如 Mathias 指出的那样,您的数据不明确,因为列As per new account 等值在技术上包含 三个 值,因为它嵌入了空格)。

  • 这样的数据行可以和后面的行(只)盲目拼接,组成一个完整的数据行。

# Create a sample file.
@'
billing   summary_id  offer_id   vendor_id  import_v   system_ha  rand_dat  mand_no  sad_no   cad_no
11        23             44       77        88         99         100       11        12        500
1111      2333           4444    6666       7777777   8888888888   8888888888888  9999999999 1111111111111 2000000000
33333      444444     As per new account ddddddd gggggggggggg wwwwwwwwwww bbbbbbbbbbb qqqqqqqqqq rrrrrrrrr 5555555
22 33 44 55 666
42 65 66 55  244
11        23             44       76        88         99         100       11        12        500
1111      2333           new document    664466       7777777   8888888888   8888888888888  9999999999 111111144111 200055000
'@ > sample.txt

# Read the file into the header row and an array of data rows.
$headerRow, $dataRows = Get-Content sample.txt

# Determine the number of whitespace-separated columns.
$columnCount = (-split $headerRow).Count

# Process all data rows and save the results back to the input file:
#  Whenever a data row with fewer columns is encountered,
#  join it with the next row.
$headerRow | Set-Content sample.txt
$joinWithNext = $false
$dataRows |
  ForEach-Object {
    if ($joinWithNext) {
      $partialRow + ' ' + $_
      $joinWithNext = $false
    }
    elseif ((-split $_).Count -lt $columnCount) {
      $partialRow = $_
      $joinWithNext = $true
    }
    else {
      $_
    }
  } | Add-Content sample.txt