合并 csv - 不加入
Merge csv's - no join
我需要合并大量 Excel 电子表格。我使用 PowerSHell 将它们转换为 CSV,现在需要合并它们,但不像通常那样。合并不使用联接。如果我有 3 个文件,每个文件有 100 行,我的新文件应该有 300 行。因此,如果 UNION 比 JOIN 更能使用数据库术语。
有些列确实具有相同的名称。有些人没有。如果它们具有相同的名称,则不应创建新列。有没有一种方法可以做到这一点而不必手动将所有列列为属性?
示例(只有 2 个文件)
文件 1:
Name Address
Bob 123 Main
文件 2:
Name City
Bob LA
Tom Boston
结果
Name Address City
Bob 123 Main
Bob LA
Tom Boston
归根结底,这可能无法正确排序。这里的技巧是读取每个文件的 header 并将其收集为字符串数组并删除重复项。
此代码假定所有文件都位于同一位置。如果不是,您将需要考虑到这一点。
$files = Get-ChildItem -Path 'C:\temp\csv\' -Filter '*.csv' | Select-Object -ExpandProperty FullName
# Gather the headers for all the files.
$headers = $files | ForEach-Object{
(Get-Content $_ -Head 1).Split(",") | ForEach-Object{$_.Trim()}
} | Sort-Object -Unique
# Loop again now and read in the csv files as objects
$files | ForEach-Object{
Import-Csv $_
} | Select-Object $headers
输出将如下所示:
Address City Name
------- ---- ----
123 Main Bob
LA Bob
Boston Tom
我需要合并大量 Excel 电子表格。我使用 PowerSHell 将它们转换为 CSV,现在需要合并它们,但不像通常那样。合并不使用联接。如果我有 3 个文件,每个文件有 100 行,我的新文件应该有 300 行。因此,如果 UNION 比 JOIN 更能使用数据库术语。
有些列确实具有相同的名称。有些人没有。如果它们具有相同的名称,则不应创建新列。有没有一种方法可以做到这一点而不必手动将所有列列为属性?
示例(只有 2 个文件)
文件 1:
Name Address
Bob 123 Main
文件 2:
Name City
Bob LA
Tom Boston
结果
Name Address City
Bob 123 Main
Bob LA
Tom Boston
归根结底,这可能无法正确排序。这里的技巧是读取每个文件的 header 并将其收集为字符串数组并删除重复项。
此代码假定所有文件都位于同一位置。如果不是,您将需要考虑到这一点。
$files = Get-ChildItem -Path 'C:\temp\csv\' -Filter '*.csv' | Select-Object -ExpandProperty FullName
# Gather the headers for all the files.
$headers = $files | ForEach-Object{
(Get-Content $_ -Head 1).Split(",") | ForEach-Object{$_.Trim()}
} | Sort-Object -Unique
# Loop again now and read in the csv files as objects
$files | ForEach-Object{
Import-Csv $_
} | Select-Object $headers
输出将如下所示:
Address City Name
------- ---- ----
123 Main Bob
LA Bob
Boston Tom