Powershell 合并多个csv文件,忽略元数据行并处理不同的引用

Powershell 合并多个csv文件,忽略元数据行并处理不同的引用,powershell,Powershell,我正在尝试在Powershell中合并CSV文件。我在这里读了很多答案,但我被困在这个问题上了 我有一个csv文件列表,有两个困难: [A] 每个文件都有一个元数据行,标题在第二行 [B] 每个文件都有相同的结构,但有时会在列周围加引号以转义内容 感谢这个问题:, 我能够单独解决这两个问题 然而,我一直坚持将解决方案结合起来 部分解决方案A 跳过每个元数据行以及后续文件的头 将答案改编自: 问题是:Import Csv$destination_file会给出不一致的结果,因为每个源文件的引用

我正在尝试在Powershell中合并CSV文件。我在这里读了很多答案,但我被困在这个问题上了

我有一个csv文件列表,有两个困难:

  • [A] 每个文件都有一个元数据行,标题在第二行
  • [B] 每个文件都有相同的结构,但有时会在列周围加引号以转义内容
感谢这个问题:, 我能够单独解决这两个问题

然而,我一直坚持将解决方案结合起来

部分解决方案A

跳过每个元数据行以及后续文件的头

将答案改编自:

问题是:
Import Csv$destination_file
会给出不一致的结果,因为每个源文件的引用可能不同

部分溶液B

成功处理随机引用的列

由提供的解决方案

Import Csv
在源文件的每一行中,列引号(无论列与列之间的引号有多大不同)保持一致时,似乎可以优雅地导入数据

我无法将此解决方案与上面的解决方案相结合

Get-ChildItem -Path $sourcefilefolderPath -File  -Filter *.csv -Recurse |
  Select-Object -ExpandProperty FullName |
  Import-Csv |
  Export-Csv $destination_file -NoTypeInformation -Append
非常感谢你的帮助

解决方案C

在我的电脑上生成空白文件

使用来自

---编辑---

结果

我可以通过使用第一个匹配的源文件创建appended_files.csv,然后将其追加到该文件中来解决此问题

$pattern_sourceFile = "*.csv*"

$list_files = Get-ChildItem -Path $sourcefilefolderPath -File -Recurse | Where { 
   $_FullName -match $pattern_sourcefile }

Get-Content $list_files[0].FullName | 
 Select-Object -Skip 1 | # skips metadataline
 ConvertFrom-Csv | Export-Csv $destinationfilePath -NoTypeInformation

$list_files | 
 Select-Object -Skip 1 | # skips $array_files[0]
 foreach { Get-Content $_.FullName | 
           Select-Object -Skip 1 | # skips metadata line
           ConvertFrom-Csv |
           Export-Csv $destinationfilePath -NoTypeInformation -Append }

使用
ConvertFrom Csv
而不是
Import Csv
,这样您仍然可以控制要跳过的行数:

获取内容$file |选择-跳过1 |从Csv转换
因此,你最终会得到如下结果:

$sourcefilefolderPath=“C:\CSV\u文件夹”
$destinationfilePath=“C:\added\u files.csv”
Get ChildItem-Path$sourcefilefolderPath-Filter*.csv-Recurse | foreach{
获取内容$|.FullName |选择对象-跳过1 |从Csv转换|导出Csv-路径$destinationfilePath-NoTypeInformation-追加
}
Get-ChildItem -Path $sourcefilefolderPath -File  -Filter *.csv -Recurse | foreach {
    Write-Host $_.FullName |
    Get-Content $_.FullName | Select-Object -Skip 1 | ConvertFrom-Csv |
    Export-Csv $destinationfilePath -NoTypeInformation -Append
$pattern_sourceFile = "*.csv*"

$list_files = Get-ChildItem -Path $sourcefilefolderPath -File -Recurse | Where { 
   $_FullName -match $pattern_sourcefile }

Get-Content $list_files[0].FullName | 
 Select-Object -Skip 1 | # skips metadataline
 ConvertFrom-Csv | Export-Csv $destinationfilePath -NoTypeInformation

$list_files | 
 Select-Object -Skip 1 | # skips $array_files[0]
 foreach { Get-Content $_.FullName | 
           Select-Object -Skip 1 | # skips metadata line
           ConvertFrom-Csv |
           Export-Csv $destinationfilePath -NoTypeInformation -Append }