我希望社区专家能以最好的方式指导我。
在没有可能安装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,