我有两张桌子。每个表的格式为
x y m me
5 6 7 .01
12 14 6 INDEF
两者都是.txt文件。表2具有相似的值,但偏移了一个小的差异(低于〜.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行到超过2,000行的任何位置。他们的列总是按照相同的顺序。
我知道如何在topcat中做类似的事情,但现在我需要用C ++,Python 3.x或其他语言来做(虽然这两个是我的第一选择)。我没有任何类型的编程经验 - 我应该关注哪些命令?我想使用X或Y列来查找匹配的相应数据集,因为m列的值范围非常有限。
答案 0 :(得分:0)
你真的应该考虑将数据移动到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('%s1\t%s2\t%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('%s\t%s\t%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()