2017-04-06 2 views
-1

Was ich tun muss, ist eine Reihe von Textdateien (CSV, alle in einem Verzeichnis) und erstellen Sie Dateien, bei denen die gesamte Ausgabe Zeile um Zeile umgekehrt wird, aber die Kopfzeile bei die Spitze, anstatt unten zu enden.Verwenden einer forEach-Schleife, um csv-Dateien umzukehren

Ich kann eine Datei (namentlich) nehmen und die erste Zeile kopieren und eine neue Datei mit nur dieser Zeile erstellen. Dann nehme ich die Originaldatei minus die erste Zeile, lese sie in ein Array und kehre sie um. Ich füge das dann an die Datei an, die nur den Header hat. Es funktioniert gut, bis auf den Namen der Ausgabe, die ich gerne [file-REV.csv] wäre, aber bis jetzt habe ich nur [file.csv-REV] ...

Also, sobald ich hatte das funktioniert, dachte ich, es war Zeit zu haben Das Programm findet alle csv 's im Verzeichnis und durchläuft sie, um für jedes eine umgekehrte Datei zu erstellen.

Das ist, was ich bisher habe:

cd c:\users\$([Environment]::UserName)\working 

$Path = "c:\users\$([Environment]::UserName)\working\" 

ForEach ($file in Get-ChildItem -Filter *.csv) { 
    Get-Content $file -totalcount 1 | Set-Content .\$file-REV.csv 
    $flip = (get-content | select -Skip 1) 
    [array]::Reverse($flip) 
    $flip | add-content "$file-REV.csv" 
} 

Hier ist die Botschaft, die ich erhalten, wenn Sie das Skript ausführen:

cmdlet Get-Content at command pipeline position 1

Supply values for the following parameters:

Path[0]:

Ich habe versucht, in den gesamten Weg zu bringen Get-Content -Path c:\users\jmurphy\working\ und dann Es beklagt sich, dass es nicht den gesamten Weg finden kann.

+2

Die erste Sache, die ich empfehle, ist die Ausgabe von ["Get-Help Get-ChildItem -Detailed"] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft. powershell.management/get-childitem) und ['Get-Help Get-Content-Detailliert'] (https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get- Inhalt). Sie werden feststellen, dass das Cmdlet Get-Help einer der nützlichsten ist, wenn Sie sich mit der Verwendung von PowerShell vertraut machen. –

+1

Ignorieren mögliche andere Probleme geben 'Get-Content' den Dateinamen aus der Schleife, die Sie '$ flip = (get-content $ datei | select -Skip 1)' '. _c: \ users \ jmurphy \ working_ ist ein Ordner .. keine Datei. – Matt

+0

Danke euch beiden. Ich fange mit deinen Vorschlägen an. Ich wusste nicht einmal über Get-Help (MS-man ist wie es klingt). Vielen Dank! –

Antwort

1

Paar Dinge. Zuerst definieren Sie den Ordner, der in einer Variablen arbeiten soll. Verwenden Sie ihn also in der Get-ChildItem. (Ich ändere den Namen aus Gewohnheit in $Folder, weil $Path Variable bereits im Bereich Umgebung verwendet wird. Auch $env: ist eine schnellere Möglichkeit zum Lesen der Variablen aus dem Bereich Umgebung.).

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 

Zweitens Sie wollen nur von der Fullname Eigenschaft verwenden, was von Get-ChildItem zurückgegeben, weil das der vollständige Pfad jeder Datei ist.

ForEach ($File in $Files) { 

So werden Sie, dass die vollständige Pfad zur Datei in Ihrem Get-Content

Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 

verwenden möchten und Sie werden $File wieder als der Pfad zur Datei verwenden möchten, wenn Sie Get-Content wieder anrufen :

$Flip = (Get-Content $File.Fullname | Select -Skip 1) 

Basename ist Eigentum von Get-Childitem mit nur den Dateinamen ohne die Erweiterung. Sie können eine Auswertung einer Eigenschaft einer Variablen in Anführungszeichen erzwingen, indem Sie sie in $() einschließen.

$Flip | Add-Content "$($file.Basename)-REV.csv" 

Alle zusammen das Skript sollte wie folgt aussehen:

$Folder = "C:\Users\$env:UserName\working\" 
$Files = Get-ChildItem $Folder -Filter *.csv 
ForEach ($File in $Files) { 
    Get-Content $File.Fullname -totalcount 1 | Set-Content .\$($file.Basename)-REV.csv 
    $Flip = (Get-Content $File.Fullname | select -Skip 1) 
    [array]::Reverse($Flip) 
    $Flip | Add-Content "$($file.basename)-REV.csv" 
} 
+0

Hey Ben, ausgezeichnete Antwort! Sie sollten die abschließenden Schrägstriche in Ihren Pfaden entfernen, so dass StackOverflow Syntax Highlighting ordnungsgemäß funktioniert, anstatt den gesamten Codeblock als Zeichenfolge zu interpretieren. (Der Backslash-Charakter ist ein Escape-Zeichen in anderen Sprachen wie C#) – Bluecakes

+0

@Bluecakes Keine Notwendigkeit wirklich. Sieh dir den Schnitt an. Wenn das passiert, benutze ich '' um die Quelle nicht zu sehr zu ändern. Es ist nicht perfekt, aber es ist ein wenig besser – Matt

+0

Während es nicht sehr kostspielig ist, warum nicht einfach die Datei einmal lesen und entsprechend teilen. Ich glaube auch nicht, dass Sie die Fullname-Eigenschaft exklusiv verwenden müssen. Nur '$ file' würde funktionieren. – Matt

0

Joe, Sie sind wohlauf bei Powershell lernen. Sie müssen nur die Macht der Objektorientierung ein wenig mehr nutzen.

Sie wissen bereits, dass Get-ChildItem ein Objekt über die Datei (en) zurückgibt. Was Sie wissen müssen, sind die Mitglieder, die in diesem Objekt enthalten sind. Verwenden Sie Get-Member, um das herauszufinden.

Sobald Sie ein interessantes Mitglied finden, sehen Sie, was sein Wert ist.

$file.Name 
$file.Extension 
$file.BaseName 

Von diesem können Sie einen neuen Dateinamen erstellen.

$newFilename = $file.Basename + '-REV' + $file.Extension 

Setzen Sie dies vor der Get-Content-Zeile. Dann benutze $ newFilename mit Add-Content.

Verwandte Themen