2017-04-06 54 views
-1

我需要做的是獲取大量文本文件(csv,全部位於一個目錄中)並創建文件,其中整個輸出逐行反轉,但將標題保持在頂部而不是結束在底部。使用ForEach循環來反轉csv文件

我能夠接受一個文件(通過名稱),並複製第一行,並創建一個新的文件,只是在該行中。然後,我將原始文件減去第一行,將其讀入數組並將其反轉。然後我將它附加到只有標題的文件。它工作正常,除了輸出名稱,我想是[file-REV.csv],但到目前爲止,我只得到了[file.csv-REV] ...

所以,一旦我有這個工作,我認爲是時候了該程序會查找目錄中的所有csv並通過它們循環,爲每個目錄創建一個反向文件。

這是我到目前爲止有:

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" 
} 

這裏是執行腳本時,我收到消息:

cmdlet Get-Content at command pipeline position 1

Supply values for the following parameters:

Path[0]:

我試圖把整個路徑Get-Content -Path c:\users\jmurphy\working\然後它抱怨說它無法找到整個路徑。

+2

我推薦的第一件事是看的輸出['獲取幫助獲取-ChildItem -Detailed'(https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft。 powershell.management/get-childitem)和['獲取幫助獲取內容-Detailed'(https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.management/get-內容)。在學習如何使用PowerShell時,您會發現'Get-Help' cmdlet是最有用的一個。 –

+1

忽略潛在的其他問題可以使'Get-Content'成爲您製作的$ loop =(get-content $ file | select -Skip 1)''的文件名。 _c:\ users \ jmurphy \ working_是一個文件夾..不是文件。 – Matt

+0

謝謝你們倆。我會從你的建議開始。我甚至不知道Get-Help(MS-man就是這樣的)。謝謝! –

回答

1

夫婦的事情。首先,您要定義文件夾以便在變量中工作,因此請使用Get-ChildItem中的文件夾。 (我將名稱更改爲$Folder,因爲$Path已在環境範圍內使用過變量,並且$env:是從環境範圍中讀取變量的更快方法。)。

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

其次,你只是想用什麼從從Get-ChildItem返回是因爲這是每個文件的完整路徑Fullname財產。

ForEach ($File in $Files) { 

所以你要使用完整路徑文件在您Get-Content

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

,你會想,當你再打電話Get-Content再次使用$File的文件路徑:

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

BasenameGet-Childitem財產只有不帶擴展名的文件名。您可以通過在$()中包含一個對雙引號內的變量屬性的評估。

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

所有一起腳本應該是這樣的:

$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

嘿,本,優秀的答案!您應該刪除路徑中的尾部斜槓,以便StackOverflow語法高亮顯示正常工作,而不是將整個代碼塊解釋爲字符串。 (反斜槓字符是C#等其他語言中的轉義字符) – Bluecakes

+0

@藍莓不需要。看看編輯。當發生這種情況時,我使用'<! - language-all:lang-cs - >'作爲不太多的來源。這不是完美的,但有點更好 – Matt

+0

雖然它不是超級昂貴的方式,爲什麼不只是在一次讀取文件,並相應地拆分。另外我不認爲你需要完全使用fullname屬性只需要'$ file'就可以工作。 – Matt

0

喬,你在學習PowerShell中做的很好。你只需要更多地利用面向對象的力量。

你已經知道Get-ChildItem會返回一個關於文件的對象。你需要知道的是包含在該對象中的成員。使用Get-Member來查找。

$file = Get-ChildItem .\t.csv 
$file | Get-Member 

一旦你找到一個有趣的成員,看看它的價值是什麼。

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

由此,您可以構造一個新的文件名。

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

把它放在Get-Content行之前。然後在Add-Content中使用$ newFilename。