1

我对 python 很陌生,并且已经解决了我在搜索和阅读这个网站时遇到的许多问题。但现在是我问的时候了……


我有一个具有以下结构的 txt 文件:

SETUP

    STN_NO  419430403
    STN_ID  "S1"
    INST_HT 1.545000;
END SETUP
SLOPE (TgtNo, TgtID, CfgNo, Hz, Vz, SDist, RefHt, Date, Ppm, ApplType, Flags)
    419430405,  "S2",   1,  0.000000,   98.799682,  12.056200,  1.700000,   18-10-2012/10:06:08.0,  0.000000,   107,    00000000;
    419430407,  "1",    1,  0.000052,   98.799806,  12.056800,  1.700000,   18-10-2012/10:06:16.0,  0.000000,   107,    00000000;
    419430409,  "2",    2,  78.734236,  99.822405,  17.919000,  0.000000,   18-10-2012/10:09:50.0,  0.000000,   107,    00000000;
    419430410,  "3",    2,  78.861726,  108.352791, 17.213700,  0.000000,   18-10-2012/10:10:10.0,  0.000000,   107,    00000000;
END SLOPE

SETUP
    STN_NO  419430459
    STN_ID  "1"
    INST_HT 1.335000;
END SETUP
SLOPE (TgtNo, TgtID, CfgNo, Hz, Vz, SDist, RefHt, Date, Ppm, ApplType, Flags)
    419430462,  "S1",   5,  122.545107, 99.563594,  12.056300,  1.700000,   18-10-2012/11:04:36.0,  0.000000,   107,    00000000;
    419430464,  "50",   5,  200.000125, 99.563463,  12.058800,  1.700000,   18-10-2012/11:04:44.0,  0.000000,   107,    00000000;
    419430466,  "51",   6,  60.723043,  95.842462,  8.607300,   0.000000,   18-10-2012/11:06:36.0,  0.000000,   107,    00000000;
    419430467,  "52",   6,  99.683958,  95.664912,  7.581100,   0.000000,   18-10-2012/11:08:15.0,  0.000000,   107,    00000000;
    419430468,  "53",   6,  101.389131, 87.173327,  7.853000,   0.000000,   18-10-2012/11:08:51.0,  0.000000,   107,    00000000;
END SLOPE
END THEODOLITE

问题是我想在每行的末尾添加正确的 INST_HT 值(意味着 SLOPE 和 END SLOPE 之间的第一个数据块中的 1.545000 和第二个中的 1.335000 等)。

目标是创建一个适当的 csv 文件,其中包含 TgtID、Hz、Vz、SDist、RefHt 列(已经完成)和 INST_HT(错过了那个!!!)的数字数据。

到目前为止,我所做的唯一想法是创建一个列表,其中包含从文件开头到结尾的所有 INST_HT 值。

有任何想法吗?

4

2 回答 2

0

这应该适用于您描述的问题:

INST_HT = [1.545000,
           1.335000]
lines = open('tmp.txt')
out = open('tmp2.txt', 'w')
i = -1
while True:
    try:
        line = lines.next()
    except StopIteration:
        break
    if 'slope' in line.lower():
        i += 1
        out.write(line)
        while True:
            line = lines.next()
            if 'end slope' in line.lower():
                out.write(line)
                break
            else:
                out.write('    ' + line.strip()[:-1] + ', ' + str(INST_HT[i]) + ';\n')
    else:
        out.write(line)
out.close()
于 2013-06-25T20:29:41.243 回答
0

以这种方式思考问题:您想逐行进行,并且对每一行做不同的事情。

last_inst_ht = None
in_slope = False
with open('infile.txt') as infile, open('outfile.txt') as outfile:
    for line in infile:
        if line.startswith('SLOPE'):
            bits = line.split(')')
            line = bits[0] + ', INST_HT' + bits[1]
            in_slope = True
        elif line.startswith('END SLOPE'):
            in_slope = False
        elif in_slope:
            bits = line.split(';')
            line = bits[0] + ', ' + last_inst_ht + bits[1]
        elif line.strip().startwith('INST_HT'):
            last_inst_ht = line.strip().split()[-1][:-1]
        outfile.write(line)

您可以通过跟踪更多状态信息来使其更加健壮。如果你得到一个INST_HT外部的 a SETUP,也许你应该打印一个警告或错误。或者,如果您SETUPSLOPE. 或者如果你得到一个SETUP没有一个INST_HT。等等。

此外,我解析线条的方式并不完全可靠。例如,如果您可以;在其中一个字段中添加 a,我们将改为在last_inst_ht该字段的中间而不是末尾。但是我想让事情简单明了,希望你能理解逻辑,而不是盲目地复制它,这样你以后可以自己扩展和调试它。

于 2013-06-25T20:53:35.330 回答