1

我正在尝试从 .mdb 文件中提取一个表,然后过滤该表并将结果吐出到简短的 .csv 文件中。到目前为止,我能够提取所需的表格并将其内容保存到 .CSV 中。但我不知道如何对这些数据进行排序并提取我需要的必要行。我想我可以保存整个 .csv 然后重新打开它,但是因为我需要处理大约 2000 个 mdb 文件,所以会占用大量空间。我只想提取某些行。

Cycle Test_Time  Current    Voltage
1     7.80E-002 0.00E+000   1.21E-001
1     3.01E+001 0.00E+000   1.19E-001
1     6.02E+001 0.00E+000   1.17E-001
2     9.02E+001 0.00E+000   1.14E-001
2     1.20E+002 0.00E+000   1.11E-001
2     1.50E+002 0.00E+000   1.08E-001
2     1.80E+002 0.00E+000   1.05E-001
2     2.10E+002 0.00E+000   1.02E-001
3     2.40E+002 0.00E+000   9.93E-002
3     2.70E+002 0.00E+000   9.66E-002
3     3.00E+002 0.00E+000   9.38E-002
3     3.10E+002 4.00E-001   1.26E+000

例如,在上表中,我想做以下事情:

  1. 提取每个循环的最后一行,或者更高级地,按时间对循环进行排序并提取循环中时间最晚的行。如您所见,由于我们的测试机故障,最后一行并不总是有最新的时间,但通常有。但数字越大时间越晚。
  2. 提取最后五个周期的所有行。
  3. 提取周期 4 到周期 30 的所有行。

这是我的代码:

import sys, subprocess, glob

mdbfiles = glob.glob('*.res')
for DATABASE in mdbfiles: 

    subprocess.call(["mdb-schema", DATABASE, "mysql"])

    table_names = subprocess.Popen(["mdb-tables", "-1", DATABASE],
                                   stdout=subprocess.PIPE).communicate()[0]
    tables = table_names.splitlines()

    sys.stdout.flush()

    a=str('Channel_Normal_Table')

    for table in tables:
        if table != '' and table==a:

            filename = DATABASE.replace(".res","") + ".csv"
            file = open(filename, 'w')
            print("Dumping " + table)
            contents = subprocess.Popen(["mdb-export", DATABASE, table],
                                        stdout=subprocess.PIPE).communicate()[0]

            # I NEED TO PUT SOMETHING HERE TO SORT AND EXTRACT THE DATA I NEED


            file.write(contents)
            file.close()
4

1 回答 1

1

不处理扁平的行列表可能更容易,而是将其转换为允许首先更轻松地“查询”数据的结构。类似于 dicts 的列表,其中每个 dict 代表一个循环:

cycles = {}

rows = contents.splitlines()  # split the `contents` text blob into individual lines

for row in rows[1:]:  # the first line in your question is a header - [1:] skips it
    row = rows.split()  # split each line by whitespace
    cycle = cycles.setdefault(row[0], {'id': row[0], 'rows': []}
    cycle['rows'].append({'cycle':row[0], 'test_time': row[1], 'current': row[2], ...})

然后您可以按 test_time 对它们进行排序:

for key, cycle in cycles.items():
    cycles['rows'].sort(key=itemgetter('test_time'))

然后你可以处理你的数据。每个循环的最后一行:

 for key, cycle in cycles.items():
    output_row(cycles['rows'][-1])

最近五个周期的行:

 for key, cycle in sorted(cycles.items())[:-5]:
    output_rows(cycles['rows'])

从 4 到 30 提取行:

for idx in range(4, 31):
    cycle = cycles[str(idx)]
    output_rows(cycles['rows'])
于 2013-06-18T01:15:50.080 回答