【问题标题】:Merge csv's - no join合并 csv - 不加入
【发布时间】:2015-10-07 18:52:56
【问题描述】:

我需要合并大量 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

【问题讨论】:

  • 您如何知道要保留哪些属性?只是所有文件共享的那些?你有没有为此尝试过任何东西?回答第一个问题就是这个问题的答案。
  • 我想要所有文件的所有属性。我尝试使用我在网上找到的 join-object 函数并进行完全连接,但它不起作用。
  • 你有没有为此尝试过的东西......即使是最小的努力也会在这个问题中看起来不错。
  • 我编写了将 excel 文件转换为 csvs 并循环导入 csvs 的代码。我还不知道如何进行合并。我以前也这样做过加入文件,但从来没有这样。
  • 您可以简单地连接文件:$File3 = $File1, $File2 和 $File3 将包含所有对象(包括属性,证明:$File3[1].City)但如果您使用管道 $File3,大多数 cmdlet 只会查看定义相关属性的第一个对象(包括将其通过管道传输到输出!)。因此你需要联合$File3 = $File1, $File2 | Union-Object,见:stackoverflow.com/a/44429084/1701026

标签: powershell csv export-to-csv


【解决方案1】:

归根结底,这可能没有正确排序。这里的技巧是读取每个文件的标题并将其收集为字符串数组并删除和删除重复项。

此代码假定所有文件都位于同一位置。如果不是,您将需要考虑这一点。

$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 

【讨论】:

  • 我会试一试的。我认为这是首先阅读所有标题的正确策略。
  • 我认为这行得通!谢谢。你能想出一种简单的方法来使用这种技术组合具有不同名称的列吗?例如,如果列名是 Name、Nm 或 Fullname,则将它们全部放在名为 name 的列中。我知道我可以在最后做一个 Select 并使用表达式。不确定这是否是最好的方法。
  • @user1921849 我有一个方法的想法,但它不在这个问题的范围内。如果需要,您可以提出一个新问题并参考这个问题。一种方法是更改​​文件的标题并根据已知差异重新保存。我可以想到另一个动态的,但又超出了这个问题的范围。
  • 谢谢。我想到了。我只是将任何表达式添加到 $headers 并删除我不需要的项目。 Like $headers+= @{Name="Extra";Expression={$_."Business Line"}}
猜你喜欢
  • 2014-08-29
  • 2021-11-17
  • 1970-01-01
  • 1970-01-01
  • 2011-11-16
  • 1970-01-01
  • 2017-10-25
  • 2018-01-29
  • 2021-12-30
相关资源
最近更新 更多