我有两个表。每张表格的形式为
x y m me
5 6 7 .01
12 14 6 INDEF
两者都是.txt文件。表2具有相似的值,但偏移了一个较小的差值(小于0.01),该差值在值之间不是恒定的,可以是正的,也可以是负的。构成表1中的行2的不一定是表2中的行2。我的输出应该是格式
x1 x2 xdiff y1 y2 ydiff
5 6 1 5 5.1 .1
其中,x1是来自表1的适当片段的x值,x2是来自表2的值,xdiff是两者之间的差,对于所有列以类似的方式继续。在任一值为INDEF的情况下(它们将始终是数字或那个),差值也应读取INDEF。两个表的行数相同,但可以是4行到2000行以上。它们的列总是按相同的顺序排列。
我知道如何在topcat中做类似的事情,但现在我需要用C++、Python3.x或其他语言来做(尽管这两种语言是我的第一选择)。我没有任何类型的编程经验我应该查看哪些命令?我想使用X或Y列来找到合适的匹配数据集,因为m列的值范围非常有限。
您真的应该考虑将数据移动到SQL,这样您就不必不断地重新发明轮子了。
以下代码主要执行您想要的操作。
浮点稳定性问题可以通过使用decimal.Decimal
来隐藏,但在执行此操作之前,您应该仔细考虑这些问题。
#!/usr/bin/env python3
def parse(val):
if val == 'INDEF':
return float('nan')
return float(val)
def unparse(val):
if val != val:
return 'INDEF'
return str(val)
def main():
import sys
if len(sys.argv) != 3:
sys.exit('Usage: ./join.py table1.txt table2.txt')
with open(sys.argv[1]) as af, open(sys.argv[2]) as bf:
a_keys = next(af).split()
b_keys = next(bf).split()
common_keys = sorted(set(a_keys) & set(b_keys))
print('t'.join('%s1t%s2t%sdiff' % (k, k, k) for k in common_keys))
for a_line, b_line in zip(af, bf):
a_bits = {k: parse(v) for (k, v) in zip(a_keys, a_line.split())}
b_bits = {k: parse(v) for (k, v) in zip(b_keys, b_line.split())}
print('t'.join('%st%st%s' % (unparse(a_bits[k]), unparse(b_bits[k]), unparse(abs(a_bits[k] - b_bits[k]))) for k in common_keys))
if __name__ == '__main__':
main()