表格与错误边界匹配

时间:2016-04-02 16:16:57

标签: python c++ python-3.x jointable

我有两张桌子。每个表的格式为

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列的值范围非常有限。

1 个答案:

答案 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()