如何将多个CSV文件按列合并?Windows命令行copy结果不符需求
如何在Windows下将多个CSV文件按列合并
我有15个CSV文件需要合并为一个文件,每个CSV文件对应合并后文件的一列。尝试用Windows命令行的copy *.csv combined.csv命令合并,结果却是把所有内容堆叠到单一列里,不符合预期。
原始文件示例
D1.csv D2.csv D3.csv 11 21 31 12 22 32 13 23 33
执行copy *.csv combined.csv后的结果
11 12 13 21 22 23 31 32 33
期望结果
11 21 31 12 22 32 13 23 33
解决方案:用PowerShell实现列合并
Windows的copy命令只是简单拼接文件内容,没法实现按列合并,你可以用PowerShell脚本完成这个需求:
方法1:适用于无表头、行数相同的CSV文件
打开PowerShell,切换到CSV文件所在目录,执行以下命令:
# 获取所有CSV文件 $csvList = Get-ChildItem -Filter *.csv # 读取所有文件内容 $allContent = $csvList | ForEach-Object { Get-Content $_.FullName } # 计算每个文件的行数 $rowCount = $allContent.Count / $csvList.Count # 逐行拼接各文件对应行的内容 for ($i = 0; $i -lt $rowCount; $i++) { $currentLine = @() foreach ($file in $csvList) { # 取当前文件的第i行内容 $currentLine += $allContent[$i + $csvList.IndexOf($file)*$rowCount] } # 用空格分隔列,追加到合并文件 $currentLine -join ' ' | Out-File -Append combined.csv }
方法2:支持带表头的CSV文件(可自定义分隔符)
如果你的CSV文件有表头,或者需要用逗号作为分隔符,可以用这个脚本:
$csvFiles = Get-ChildItem -Filter *.csv $combinedRows = @() # 获取第一个文件的行数,确保所有文件行数一致 $firstFileRows = Import-Csv $csvFiles[0].FullName $totalRows = $firstFileRows.Count for ($rowIndex = 0; $rowIndex -lt $totalRows; $rowIndex++) { $newRow = [ordered]@{} foreach ($file in $csvFiles) { # 读取当前文件的所有行 $fileRows = Import-Csv $file.FullName # 取当前行的内容,用文件名作为表头(可自定义) $newRow[$file.BaseName] = $fileRows[$rowIndex].PSObject.Properties.Value[0] } $combinedRows += [PSCustomObject]$newRow } # 导出合并后的文件,这里用空格作为分隔符,可改成',' $combinedRows | Export-Csv -Path 'combined.csv' -NoTypeInformation -Delimiter ' '
内容的提问来源于stack exchange,提问作者user19428866
相关产品推荐
相关产品推荐

