连接两个CSV的最简单的方式(像SQL左连接)



我希望社区专家能以最好的方式指导我。

在没有可能安装MS-Office应用程序的windows上运行的专业环境中,我需要向我的团队分发一种方法来加入2个CSV文件并产生第三个CSV文件作为输出。就像我们运行这样的SQL查询:

SELECT f1.*, f1.bar = f2.bar as baz 
FROM CSVfile1 as f1 
LEFT JOIN CSVfile2 as f2 
ON f1.key = f2.key

目标是目前达到与Excel + VBA,但MS-office软件包将被删除,不再访问。基于同样的原因,ms - access的解决方案是不可想象的。

目标是允许任何人在没有任何能力和特定安装的情况下实现第三个CSV。因此,使用python或ms - sql - server的方法也不是很好。

我想完成与Powshell脚本,但首先。我不习惯使用PowerShell,但我可以学习。

但在尝试之前,我问社区这是最好的方法吗?或者是否有更好的解决方案?(要求:Windows操作系统(最新版本),无MS-office,无特定安装)。

谢谢大家。

从v7.2开始,PowerShell没有内置连接功能(类似于SQL的[1])虽然在GitHub问题#14994中提出了添加Join-Object cmdlet;第三方解决方案是可用的,通过PowerShell图库(例如,JoinModule)。

现在,如果不能安装第三方工具,您可以滚动您自己的解决方案使用以下方法,使用Import-Csv加载CSV文件,使用辅助哈希表查找相应的行,使用Add-Member添加列(属性)。

# Create sample CSV files.
$csv2 = @'
key,bar,quux
key1,bar1,quux1
key2,bar2,quux2
key3,bar3,quux3
'@ > ./CSVFile1.csv
@'
key,bar
key1,bar1
key2,bar2a
'@ > ./CSVFile2.csv
# Import the the 2nd file and load its rows 
# (as objects with properties reflecting the columns)
# into a hashtable, keyed by the column 'key' values.
$hash = @{}
foreach ($row in Import-Csv ./CSVFile2.csv) {
  $hash[$row.key] = $row
}
# Import the 1st file and process each row (object):
# Look for a matching object from the 2nd file and add 
# a calculated column derived from both objects to the
# input object.
Import-Csv ./CSVFile1.csv | ForEach-Object {
  $matching = $hash[$_.key]
  $_ |
    Add-Member -PassThru baz $(if ($matching) { [int] ($matching.bar -eq $_.bar) })
}

将最后一条语句管道到Export-Csv以将结果对象导出到CSV文件。(例:
... | Export-Csv -NoTypeInformation -Encoding utf8 Results.csv)

上面的结果如下:

key  bar  quux  baz
---  ---  ----  ---
key1 bar1 quux1   1
key2 bar2 quux2   0
key3 bar3 quux3    

[1]有一个-join操作符,但它的目的是将单个数组中的元素连接成一个单个字符串

下面是使用sqlite命令行shell(单个900kb可执行文件)和相同的sql join命令的一个奇特的答案。https://sqlite.org/download.html Sqlite似乎在使用utf16或"unicode"文本文件。即使是Excel也很难导入utf16格式的csv文件。

# making csv file with ">" (utf16) caused this error:
# CREATE TABLE csvfile1(...) failed: duplicate column name:
'key,bar,quux
key1,bar1,quux1
key2,bar2,quux2
key3,bar3,quux3' | set-content csvfile1.csv
'key,bar
key1,bar1
key2,bar2a' | set-content csvfile2.csv
'.mode csv
.import csvfile1.csv csvfile1
.import csvfile2.csv csvfile2
.headers on
SELECT f1.*, f1.bar = f2.bar as baz 
FROM CSVfile1 as f1 
LEFT JOIN CSVfile2 as f2 
ON f1.key = f2.key' | .sqlite3
# output
# key,bar,quux,baz
# key1,bar1,quux1,1
# key2,bar2,quux2,0
# key3,bar3,quux3,

相关内容

  • 没有找到相关文章

最新更新