62 Stimmen

Entfernen Sie die oberste Zeile der Textdatei mit PowerShell

Ich versuche nur, die erste Zeile von etwa 5000 Textdateien zu entfernen, bevor ich sie importiere.

Ich bin immer noch sehr neu in PowerShell, daher weiß ich nicht, wonach ich suchen soll oder wie ich vorgehen soll. Mein aktuelles Konzept mit Pseudocode:

set-content file (get-content unless line contains amount)

Ich kann jedoch anscheinend nicht herausfinden, wie man so etwas wie 'contains' macht.

5voto

noam Punkte 1783
$x = get-content $file
$x[1..$x.count] | set-content $file

Nur das. Eine lange langweilige Erklärung folgt. Get-Content gibt ein Array zurück. Wir können in Array-Variablen "eintauchen", wie in diesem und anderen Scripting-Guys-Beiträgen demonstriert wird.

Zum Beispiel, wenn wir eine Array-Variable wie folgt definieren,

$array = @("erstes Element","zweites Element","drittes Element")

dann gibt $array zurück

erstes Element
zweites Element
drittes Element

dann können wir in dieses Array eintauchen, um nur sein erstes Element abzurufen

$array[0]

oder nur sein zweites

$array[1]

oder einen Bereich von Indexwerten vom 2. bis zum letzten.

$array[1..$array.count]

4voto

Luke Du Punkte 31

Ich habe gerade von einer Website gelernt:

Get-ChildItem *.txt | ForEach-Object { (get-Content $_) | Where-Object {(1) -notcontains $_.ReadCount } | Set-Content -path $_ }

Oder Sie können die Aliase verwenden, um es kurz zu machen, wie:

gci *.txt | % { (gc $_) | ? { (1) -notcontains $_.ReadCount } | sc -path $_ }

0 Stimmen

Vielen Dank für diese Lösung. Könnten Sie die Website angeben, die Sie erwähnt haben?

2voto

Venkataraman R Punkte 10760

Ein weiterer Ansatz, um die erste Zeile aus einer Datei zu entfernen, ist die Verwendung der Mehrfachzuweisungstechnik. Siehe Link

 $firstLine, $restOfDocument = Get-Content -Path $filename 
 $modifiedContent = $restOfDocument 
 $modifiedContent | Out-String | Set-Content $filename

1voto

Skip` hat nicht funktioniert, also ist mein Workaround

$LinesCount = $(get-content $file).Count
get-content $file |
    select -Last $($LinesCount-1) | 
    set-content "$file-temp"
move "$file-temp" $file -Force

-3voto

danielmbarlow Punkte 67

Für kleinere Dateien könnten Sie dies verwenden:

& C:\windows\system32\more +1 oldfile.csv > newfile.csv | out-null

... aber es ist nicht sehr effektiv bei der Verarbeitung meiner Beispieldatei von 16MB. Es scheint nicht zu beenden und den Sperrvorgang auf newfile.csv freizugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X