使用PowerShell将多个CSV文件合并为一个

35

你好,我正在寻找一个PowerShell脚本,可以将一个目录中的所有csv文件合并成一个文本文件(.txt)。所有的csv文件都有相同的标题,该标题始终存储在每个文件的第一行。因此,我需要从第一个文件中取出标题,并跳过其余文件的第一行。

我已经找到了一个批处理文件,可以完全满足我的需求,但是我有超过4000个csv文件在单个目录中,这需要超过45分钟来完成任务。

@echo off
ECHO Set working directory
cd /d %~dp0
Deleting existing combined file
del summary.txt
setlocal ENABLEDELAYEDEXPANSION
set cnt=1
for %%i in (*.csv) do (
 if !cnt!==1 (
 for /f "delims=" %%j in ('type "%%i"') do echo %%j >> summary.txt
) else (
 for /f "skip=1 delims=" %%j in ('type "%%i"') do echo %%j >> summary.txt
 )
 set /a cnt+=1
 )

有什么建议可以创建比这个批处理代码更有效的PowerShell脚本吗?

谢谢。

约翰

15个回答

0
#Input path
$InputFolder = "W:\My Documents\... input folder"
$FileType    = "*.csv"

#Output path
$OutputFile  = "W:\My Documents\... some folder\merged.csv"

#Read list of files
$AllFilesFullName = @(Get-ChildItem -LiteralPath $InputFolder -Filter $FileType | Select-Object -ExpandProperty FullName)

#Loop and write 
Write-Host "Merging" $AllFilesFullName.Count $FileType "files."
foreach ($FileFullName in $AllFilesFullName) {
    Import-Csv $FileFullName | Export-Csv $OutputFile -NoTypeInformation -Append
    Write-Host "." -NoNewline
}

Write-Host
Write-Host "Merge Complete"

0
我发现前面的解决方案在处理大型csv文件时效率相当低下,所以这里提供了一个高效的替代方案。
以下是一种简单地附加文件的替代方案:
cmd /c copy  ((gci "YOUR_DIRECTORY\*.csv" -Name) -join '+') "YOUR_OUTPUT_FILE.csv" 

接下来,您可能想要摆脱多个CSV标题。


0

以下批处理脚本非常快速。只要您的CSV文件中不包含制表符,并且所有源CSV文件的行数都少于64k,它就应该能够很好地工作。

@echo off
set "skip="
>summary.txt (
  for %%F in (*.csv) do if defined skip (
    more +1 "%%F"
  ) else (
    more "%%F"
    set skip=1
  )
)

限制的原因是MORE将制表符转换为一系列空格,并且重定向MORE在64k行处挂起。

在第一个文件末尾没有新行符的情况下,将"TYPE"更改为"MORE"。 - dbenham

-1
$pathin = 'c:\Folder\With\CSVs'
$pathout = 'c:\exported.txt'
$list = Get-ChildItem -Path $pathin | select FullName
foreach($file in $list){
    Import-Csv -Path $file.FullName | Export-Csv -Path $pathout -Append -NoTypeInformation
}

-5

将 *.csv 类型文件追加到 folder\combined.csv 中


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接