首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在Python中使用mdbtools从.mdb文件中提取和排序数据

在Python中使用mdbtools从.mdb文件中提取和排序数据
EN

Stack Overflow用户
提问于 2013-06-15 20:18:34
回答 2查看 11.4K关注 0票数 2

我对Python还很陌生,所以如果有任何帮助,我将不胜感激。我正在尝试使用Linux上的mdbtools从2000个.mdb文件中提取和排序数据。到目前为止,我只能获取.mdb文件并将所有表转储到.csv中。它造成了巨大的混乱,因为有很多文件需要处理。

我需要的是从特定表中提取特定的排序数据。例如,我需要一个名为“电压”的表格。该表由多个循环组成,每个循环也有几行。周期通常按时间顺序进行,但在某些情况下,时间戳会延迟记录。像cycle的第一行可以有比cycle 1第一行晚的时间。我需要根据前五个周期或最后五个周期的时间提取周期的最新行。例如,在下面的表格中,我需要第二行。

代码语言:javascript
复制
Cycle#    Time        Data
  1      100.59        34
  1      101.34        54
  1      98.78         45  
  2      
  2
  2   ........... 

下面是我使用的脚本。我使用的是命令python extract.py table_files.mdb.,但我希望只使用./Extt.py调用该脚本。文件名的路径应该在脚本本身中。

代码语言:javascript
复制
import sys, subprocess, os

DATABASE = sys.argv[1]

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

# Get the list of table names with "mdb-tables"
table_names = subprocess.Popen(["mdb-tables", "-1", DATABASE],
                               stdout=subprocess.PIPE).communicate()[0]
tables = table_names.splitlines()

print "BEGIN;" # start a transaction, speeds things up when importing
sys.stdout.flush()

# Dump each table as a CSV file using "mdb-export",
# converting " " in table names to "_" for the CSV filenames.
for table in tables:
    if table != '':
        filename = table.replace(" ","_") + ".csv"
        file = open(filename, 'w')
        print("Dumping " + table)
        contents = subprocess.Popen(["mdb-export", DATABASE, table],
                                    stdout=subprocess.PIPE).communicate()[0]
        file.write(contents)
        file.close()
EN

回答 2

Stack Overflow用户

发布于 2013-06-16 22:46:22

就我个人而言,我不会花太多时间去尝试让mdbtoolsunixODBCpyodbc协同工作。正如佩德罗在他的评论中建议的那样,如果你可以让mdb-export将表转储为CSV文件,那么只需将这些CSV文件导入SQLite或MySQL,即比在Linux平台上使用mdbtools更健壮的东西,你可能会节省相当多的时间。

以下是一些建议:

  1. 考虑到涉及的.mdb文件(以及.csv文件)的绝对数量,您可能希望将CSV数据导入到一个大表中,其中包含一个额外的列来指示源文件名。在新数据库中创建目标表时,您可能希望使用decimal (而不是float)数据类型作为时间列。
  2. 同时,将Cycle#列重命名为just
  3. 。列名中的“有趣的字符”可能是一个真正的麻烦。

最后,要选择给定SourceFile和周期的“最后”读数(最大时间值),可以使用如下查询:

代码语言:javascript
复制
SELECT
    v1.SourceFile, 
    v1.Cycle,
    v1.Time, 
    v1.Data 
FROM 
    Voltage v1 
    INNER JOIN 
    (
        SELECT
            SourceFile, 
            Cycle, 
            MAX([Time]) AS MaxTime 
        FROM Voltage 
        GROUP BY SourceFile, Cycle
    ) v2 
        ON v1.SourceFile=v2.SourceFile 
           AND v1.Cycle=v2.Cycle 
           AND v1.Time=v2.MaxTime
票数 3
EN

Stack Overflow用户

发布于 2017-02-14 20:18:47

为了将它直接带到python3中的Pandas,我写了这个小代码片段

代码语言:javascript
复制
import sys, subprocess, os
from io import StringIO
import pandas as pd
VERBOSE = True
def mdb_to_pandas(database_path):
    subprocess.call(["mdb-schema", database_path, "mysql"])
    # Get the list of table names with "mdb-tables"
    table_names = subprocess.Popen(["mdb-tables", "-1", database_path],
                                   stdout=subprocess.PIPE).communicate()[0]
    tables = table_names.splitlines()
    sys.stdout.flush()
    # Dump each table as a stringio using "mdb-export",
    out_tables = {}
    for rtable in tables:
        table = rtable.decode()
        if VERBOSE: print('running table:',table)
        if table != '':
            if VERBOSE: print("Dumping " + table)
            contents = subprocess.Popen(["mdb-export", database_path, table],
                                        stdout=subprocess.PIPE).communicate()[0]
            temp_io = StringIO(contents.decode())
            print(table, temp_io)
            out_tables[table] = pd.read_csv(temp_io)
    return out_tables
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17123550

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档