PowerShell로 텍스트 파일 맨 위 줄 제거
텍스트 파일을 가져오기 전에 약 5000개의 첫 줄만 제거하려고 합니다.
저는 아직 PowerShell을 처음 접하기 때문에 무엇을 검색하거나 어떻게 접근해야 할지 잘 모르겠습니다.의사 코드를 사용하는 나의 현재 개념:
set-content file (get-content unless line contains amount)
그런데 내용물 같은 것을 어떻게 하는지 모르겠어요.
@hoge의 매우 간결한 기술과 그것을 일반화하는 포장지 기능에 대한 답변을 정말 존경하고 그것에 대한 찬성표를 독려하지만, 임시 파일을 사용하는 다른 두 답변에 대해 언급하지 않을 수 없습니다(칠판의 손톱처럼 나를 갉아먹습니다!).
파일 크기가 크지 않다고 가정하면 파이프라인을 개별 섹션에서 강제로 작동시켜 임시 파일이 필요하지 않도록 할 수 있습니다. 괄호를 신중하게 사용하면 다음과 같습니다.
(Get-Content $file | Select-Object -Skip 1) | Set-Content $file
... 또는 줄여서:
(gc $file | select -Skip 1) | sc $file
세계에서 가장 효율적인 것은 아니지만, 이는 다음과 같이 작동해야 합니다.
get-content $file |
select -Skip 1 |
set-content "$file-temp"
move "$file-temp" $file -Force
변수 표기법을 사용하면 임시 파일 없이 수행할 수 있습니다.
${C:\file.txt} = ${C:\file.txt} | select -skip 1
function Remove-Topline ( [string[]]$path, [int]$skip=1 ) {
if ( -not (Test-Path $path -PathType Leaf) ) {
throw "invalid filename"
}
ls $path |
% { iex "`${$($_.fullname)} = `${$($_.fullname)} | select -skip $skip" }
}
저도 똑같은 일을 해야 했고,gc | select ... | sc1.6GB 파일을 읽는 동안 제 컴퓨터에서 4GB의 RAM을 받았습니다.(프로세스 탐색기의 Read Bytes에서 보고한 바와 같이) 에서 전체 파일을 읽은 후 최소 20분 동안 완료되지 않았고, 그 시점에서 파일을 삭제해야 했습니다.
저의 해결책은 더 많이 사용하는 것이었습니다.NET 접근 방식:StreamReader+StreamWriter. 성능에 대한 훌륭한 답변은 이 답변을 참조하십시오.파워셸에서 대용량 텍스트 파일을 레코드 유형별로 분할하는 가장 효율적인 방법은 무엇입니까?
아래는 저의 해결책입니다.예, 임시 파일을 사용하지만, 제 경우에는 문제가 되지 않았습니다(엄청난 SQL 테이블 생성 및 삽입 문 파일이었습니다).
PS> (measure-command{
$i = 0
$ins = New-Object System.IO.StreamReader "in/file/pa.th"
$outs = New-Object System.IO.StreamWriter "out/file/pa.th"
while( !$ins.EndOfStream ) {
$line = $ins.ReadLine();
if( $i -ne 0 ) {
$outs.WriteLine($line);
}
$i = $i+1;
}
$outs.Close();
$ins.Close();
}).TotalSeconds
다음이 반환:
188.1224443
AA Soft의 답변에 영감을 받아, 저는 이를 조금 더 개선하기 위해 나섰습니다.
- 루프 변수 회피
$i와의 비교.0모든 고리에 - 실행을 a로 포장합니다.
try..finally블록 - 항상 사용 중인 파일을 닫습니다. - 파일의 처음부터 제거할 임의 수의 행에 대해 솔루션이 작동하도록 합니다.
- 변수 사용
$p현재 디렉토리를 참조하다
이러한 변경으로 인해 다음과 같은 코드가 발생합니다.
$p = (Get-Location).Path
(Measure-Command {
# Number of lines to skip
$skip = 1
$ins = New-Object System.IO.StreamReader ($p + "\test.log")
$outs = New-Object System.IO.StreamWriter ($p + "\test-1.log")
try {
# Skip the first N lines, but allow for fewer than N, as well
for( $s = 1; $s -le $skip -and !$ins.EndOfStream; $s++ ) {
$ins.ReadLine()
}
while( !$ins.EndOfStream ) {
$outs.WriteLine( $ins.ReadLine() )
}
}
finally {
$outs.Close()
$ins.Close()
}
}).TotalSeconds
첫 번째 변경으로 60MB 파일의 처리 시간이 에서 단축되었습니다.5.3s로.4s. 나머지 변경 사항은 더 외관적입니다.
$x = get-content $file
$x[1..$x.count] | set-content $file
그 정도.긴 지루한 설명이 뒤따릅니다.콘텐츠를 가져오면 배열이 반환됩니다.이 글과 다른 Scripting Guys 게시물에 나와 있는 것처럼 배열 변수를 "인덱스"할 수 있습니다.
예를 들어 배열 변수를 이렇게 정의하면
$array = @("first item","second item","third item")
따라서 $array returns
first item
second item
third item
그런 다음 해당 배열을 "인덱스"하여 첫 번째 요소만 검색할 수 있습니다.
$array[0]
아니면 두번째 밖에
$array[1]
또는 두 번째부터 마지막까지 인덱스 값의 범위입니다.
$array[1..$array.count]
방금 웹사이트를 통해 알게 되었습니다.
Get-ChildItem *.txt | ForEach-Object { (get-Content $_) | Where-Object {(1) -notcontains $_.ReadCount } | Set-Content -path $_ }
또는 별칭을 사용하여 다음과 같이 짧게 만들 수 있습니다.
gci *.txt | % { (gc $_) | ? { (1) -notcontains $_.ReadCount } | sc -path $_ }
다중 할당 기술을 사용하여 파일에서 첫 번째 줄을 제거하는 또 다른 방법.참조 링크
$firstLine, $restOfDocument = Get-Content -Path $filename
$modifiedContent = $restOfDocument
$modifiedContent | Out-String | Set-Content $filename
skip'이 작동하지 않아서 제 해결책은
$LinesCount = $(get-content $file).Count
get-content $file |
select -Last $($LinesCount-1) |
set-content "$file-temp"
move "$file-temp" $file -Force
현재 디렉터리에 있는 모든 .txt 파일을 편집하고 각 파일에서 첫 번째 줄을 제거하려는 경우.
Get-ChildItem (Get-Location).Path -Filter *.txt |
Foreach-Object {
(Get-Content $_.FullName | Select-Object -Skip 1) | Set-Content $_.FullName
}
작은 파일의 경우 다음을 사용할 수 있습니다.
& C:\window\system32\more +1 oldfile.csv > newfile.csv | out-null
... 하지만 16MB의 예제 파일을 처리하는 데는 그다지 효과적이지 않습니다.new file.csv의 잠금을 종료하고 해제하지 않는 것 같습니다.
언급URL : https://stackoverflow.com/questions/2074271/remove-top-line-of-text-file-with-powershell
'programing' 카테고리의 다른 글
| 인수를 인수로 하는 함수 전달? (0) | 2023.10.19 |
|---|---|
| 명령줄 응용 프로그램의 키보드 입력 (0) | 2023.10.19 |
| 입력 요소에는 자동 완성 속성이 있어야 합니다. (0) | 2023.10.14 |
| UIRepreshControl을 UIScrol View에서 사용할 수 있습니까? (0) | 2023.10.14 |
| Mysql, 긴/큰 데이터에서 넓은 데이터로 재구성 (0) | 2023.10.14 |