簡體   English   中英

PowerShell從10多個子文件夾復制並重命名多個.csv文件

[英]PowerShell copy and rename multiple .csv files from 10+ subfolders

我正在尋找一種方法來復制多個名稱完全相同的.csv文件,它們位於不同的文件夾中(它們都在同一目錄中)並將它們合並為1個.csv文件(我想跳過復制第一個開頭的行,除了第一個文件之外,並且沒有規則,每個.csv文件中寫入多少行,因此腳本應識別已寫入的行,以了解要合並的行數和合並的行(以避免出現空行)。

這是我到目前為止嘗試過的:

$src = "C:\Users\E\Desktop\Merge\Input\Files*.csv"
$dst = "C:\Users\E\Desktop\Merge\Output"

Get-ChildItem -Path $src -Recurse -File | Copy-Item -Destination $dst

還有這個:

Get-ChildItem -Path $src -Recurse -File | Copy-Item -Destination $dst | 
ForEach-Object {
$NewName = $_.Name
$Destination = Join-Path -Path $_.Directory.FullName -ChildPath $NewName
Move-Item -Path $_.FullName -Destination $Destination -Force
}

有什么幫助嗎? :)

由於您希望合並文件,因此您最好將它們全部閱讀到PowerShell中,然后立即輸出整個文件。 您可以執行以下操作:

$Data = Get-ChildItem -Path $src -Recurse -File | Import-Csv
$Data | Export-Csv $dst\Output.csv -NoTypeInformation

如果您的CSV文件很大,這可能不可行,但是如果所有文件的標題行都相同,這是合並CSV文件的簡單方法。

另一種方法是將其視為文本,這樣就減少了內存消耗。 為此,您需要獲取文件列表,完整復制第一個文件,然后跳過標題行復制其余文件。

$Files = Get-ChildItem $src -Recurse
$TargetFile = Join-Path $dst $Files[0].Name
$Files[0] | Copy-Item -Dest $TargetFile
#Skip the first file, and loop through the rest
$Files | Select -Skip 1 | ForEach-Object{
    #Get the contents of the file, and skip the header row, then append the rest to the target
    Get-Content $_ | Select -Skip 1 | Add-Content $TargetFile
}

編輯:好的,我想復制該過程,以便找出導致錯誤的原因。 為此,我創建了3個文件夾,並將一個包含4個條目的.csv文件復制到每個文件夾中,所有文件均名為“文件06202018.csv”。 我在上面運行了我的代碼,它做了應有的工作,但是有一些文件損壞,其中第二個文件將直接附加到第一個文件的末尾,而沒有為其創建新行,因此我從復制開始更改了一些內容第一個文件,以讀取它並在目標位置創建一個新文件。 下面的代碼為我完美地工作:

$src = "C:\Temp\Test\Files*.csv" 
$dst = "C:\Temp\Test\Output"
$Files = Get-ChildItem $src -Recurse 
$TargetFile = Join-Path $dst $Files[0].Name
GC $Files[0] | Set-Content $TargetFile 
#Skip the first file, and loop through the rest 
$Files | Select -Skip 1 | ForEach-Object{ 
    #Get the contents of the file, and skip the header row, then append the rest to the target 
    Get-Content $_ | Select -Skip 1 | Add-Content $TargetFile 
}

那拿了文件:

C:\Temp\Test\Lapis\Files 06202018.csv
C:\Temp\Test\Malachite\Files 06202018.csv
C:\Temp\Test\Opal\Files 06202018.csv

並將這三個文件合並到一個正確合並的文件中:

C:\Temp\Test\Output\Files 06202018.csv

我唯一遇到的問題是是否在運行此操作之前忘記刪除目標文件。 根據這些文件的大小以及可用的內存量,可以通過將最后兩行更改為以下內容來加快速度:

    Get-Content $_ | Select -Skip 1
} | Add-Content $TargetFile

這將讀取其中的所有文件(第一個文件除外),並且只寫入一次目標,而不必獲取文件鎖定,打開文件進行寫入,寫入和關閉每個文件的目標。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM