windows - sammenflet flere linjer til en linje baseret på at tælle antallet af forekomster af afgrænsning for hver linje

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg har data som denne:


RE\_1|Emp\_1|cty\_1|analyst\_1|end
RE\_2|EMP\_2|cty\_2|analyst\_2|end
RE\_3|EMP\_3|cty
\_3|analyst\_3|end
RE\_4|EMP\_4|cty\_4|analyst\_4|end


Den tredje linje blev opdelt i to linjer. Jeg skal flette de splittede linjer i en. Hver linje skal have 4 rørdimensioner. Så jeg skal tælle antallet af | i hver linje. Hvis det er 4, udskriver linjen. Hvis ikke 4 sammenflet derefter den næste linje med det og tjek tællingen. Hvis det stadig ikke er 4, slå også sammen den næste linje. Gentag indtil linjen indeholder 4 | afgrænsere.


Den oprindelige fil indeholder millioner af rækker, hvoraf 10000 s er opdelt som dette. Så jeg har brug for en løsning til dette enten i PowerShell eller Windows-batch, som fusionerer linjerne hurtigt.

Bedste reference


Du kan måske bruge et regulært udtryk som dette:


... -replace '(?ms)^((?:[^|
]*|){2}[^|
]*?)
?
((?:[^|
]*|){2}end)', '$1$2'


Jeg anbefaler dog ikke at behandle filer med millioner af optagelser i hukommelsen. Det er ikke rigtig sjovt, når computeren kommer til at stoppe, efter at den begyndte at bytte på grund af hukommelseudmattelse. Behandling af filen i en rørledning undgår denne slags problem:


$merged = ''
Get-Content 'C:path	oinput.txt' | ForEach-Object {
  if ($\_ -notlike '*|*|*|*|*') {
    # if the line doesn't have 4 pipe characters in it: append it to the
    # merged line variable and move on to the next line
    $merged += $\_
  } else {
    # if the line does have 4 pipe characters in it: output and clear the
    # merged line variable if it contains a value, then output the current
    # line
    if ($merged) {
      $merged
      $merged = ''
    }
    $\_
  }
} | Set-Content 'C:path	ooutput.txt'

# if the input file didn't end with a non-wrapped line the trailing wrapped lines
# haven't been written to the output file yet
if ($merged) {
  $merged | Add-Content 'C:path	ooutput.txt'
}