PowerShell从10多个子文件夹复制并重命名多个.csv文件

时间:2018-08-21 23:15:36

标签: powershell csv merge copy

我正在寻找一种方法来复制多个名称完全相同的.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
}

有什么帮助吗? :)

1 个答案:

答案 0 :(得分:0)

由于您希望合并文件,因此不妨将它们全部读取到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

这将读取其中的所有文件(第一个文件除外),并且仅写入目标一次,而不必获取文件锁定,打开文件进行写入,写入和关闭每个文件的目标。