
파일에 있는 콘텐츠로 수정한 다음 모두 하나의 요약 파일로 연결해야 하는 대규모 ASCII 텍스트 파일 세트가 있습니다. 지금까지 단계별 접근 방식을 사용하여 어느 정도 성공을 거두었습니다. 그러나 나는 이것을 단번에 하고 싶었지만 그것을 알아낼 수 없었습니다. 하나의 파일에 대해 원하는 작업을 수행하는 스크립트를 PowerShell에서 작성했지만 폴더의 모든 파일에 대해 이를 수정하는 방법을 알 수 없는 것 같습니다. 나는 루핑과 최종 파일 연결 섹션으로 어려움을 겪고 있습니다.
내 기본 파일 구조는 다음과 같습니다.
파일1.txt
Line1 - abc123 - 헤더(여기에서 문자 2,3,4를 제거하고 데이터 라인에 추가하고 싶습니다.)
Line2 - data1
Line3 - data2
LineN - abc123 - 바닥글(헤더와 중복됨)
파일2.txt
라인1 - efg456
라인2 - 데이터3
라인3 - 데이터4
라인N - efg456
파일N.txt
라인1 - hij789
라인2 - 데이터5
라인3 - 데이터6
라인N - hij789
최종 출력 파일이 머리글과 바닥글을 제거하고 파일 시작 부분의 새 열에 있는 머리글에서 콘텐츠를 추출한 다음 구조를 갖기를 원합니다(고정 너비 파일).
최종.txt
라인1 - bc1data1
라인2 - bc1data2
라인3 - fg4data3
라인4 - fg4data4
라인5 - ij7data5
라인6 - ij7data6
나는 하나의 파일에 대해 이 문제를 해결할 수 있었고 아래 코드를 넣었습니다.
cd "C:\Data\Files\"
$S1 = Get-Content File1.txt -First 1
$S2 = $S1.Substring(2,3)
Get-Content File1.txt | ForEach-Object {Add-Content a.txt "$S2$_"}
Get-Content a.txt | Select -Skip 1 | Select -SkipLast 1 | Set-Content out.txt
# extract header line
# limit to characters of interest
# append to the beginning of each line in file
# append all files together w/o first & last line
이상적으로는 정크 파일 a.txt 없이도 이 작업을 수행할 수 있지만 지금까지는 별도의 파일에 기록해야만 작동할 수 있었습니다. 저는 PowerShell을 처음 접했기 때문에 어떤 제안이나 팁이라도 주시면 감사하겠습니다(몇 시간 연습).
답변1
## Q:\Test\2017\08\25\SU_1244148.ps1
Set-Location "C:\Data\Files\"
$Files = Get-ChildItem File*.txt
$Final = ForEach ($File in $Files){
$Content = Get-Content $File
$Prefix = $Content[0].Substring(1,3)
For ($i = 1;$i -lt $Content.Length-1;$i++){
"{0}{1}" -f $Prefix,$Content[$i]
}
}
$Final | Set-Content Final.txt
> gc .\Final.txt
bc1data1
bc1data2
fg4data3
fg4data4
ij7data5
ij7data6
버전 2대용량 파일을 처리합니다
## Q:\Test\2017\08\25\SU_1244148_2.ps1
#Set-Location "C:\Data\Files\"
$Files = (Get-ChildItem File*.txt|Sort)
$Final = '.\Final.txt'
## As we append to $Final initially clear
If (Test-Path $Final){Remove-Item $Final}
ForEach ($File in $Files){
$Reader = [IO.File]::OpenText($File)
$Header = $Reader.ReadLine()
$Prefix = $Header.SubString(1,3)
$Line = $Reader.ReadLine()
while ($Reader.Peek() -ge 0) {
$Prefix+$Line| Out-File $Final -Append
$Line = $Reader.ReadLine()
}
$Reader.Dispose()
}
후행 헤더를 테스트할 필요가 없도록 코드가 최적화되었습니다.
while 루프는 이전 줄을 인쇄하고 마지막 줄을 삭제하는 방식으로 다음 줄을 읽습니다.