【问题标题】:Convert .dbc files into .csv with python [closed]使用 python 将 .dbc 文件转换为 .csv [关闭]
【发布时间】:2019-02-13 01:26:59
【问题描述】:

我正在编写一个 python 脚本来将 .DBC 文件(来自 Datasus)转换为 .CSV

我搜索了很多库来帮助我,但都没有成功。有人知道在此转换任务中可能有用的选项/包吗?

【问题讨论】:

    标签: python dbf


    【解决方案1】:

    我真的不明白为什么有些会员给这个问题-1,但没有真正回答。

    好吧,我还没有找到一个好的库来将.DBC 转换为.CSV。 但是我可以使用 Python + R 来完成它,我在这里分享我是如何实现它的。

    下面的 Python 脚本获取 R 路径并执行 dbc2csv.R 文件,发送三个参数:原始文件路径、转换后的文件路径和将转换的文件名。

    import subprocess
    import commands
    
    
    def dbc2csv(raw_filename):
    dbc2csv_path = "/path/to/script/dbc2csv.R " + raw_files_dir + " " + converted_files_dir + " " + raw_filename
    
    try:
        r_script_path = commands.getstatusoutput('which Rscript')[1]
        subprocess.call(r_script_path + " --vanilla " + dbc2csv_path, shell=True)
        return True
    except:
        print("(Rscript) Error converting file: " + raw_filename)
    
    return False
    

    下面的R脚本dbc2csv.R实际上是谁会转换。

    #install.packages("read.dbc") You need this package
    library("read.dbc")
    
    
    dbc2dbf <- function(rawDir, convertedDir, file) {
        # reads dbc file
        x <- read.dbc(paste(rawDir, file, sep=""))
        # write it to csv
        write.csv(x, file=paste(convertedDir, file, ".csv", sep=""))
    }
    
    args = commandArgs(trailingOnly=TRUE)
    try(dbc2dbf(args[1], args[2], args[3]), TRUE)
    

    我们知道如果我们可以只使用 Python 进行转换会更好。 但是这种方法会很好用。

    【讨论】:

    • 我尝试使用这种方法,但 Rstudio 打开但它不运行脚本
    • 请将您的实现发给我:abovealltheselove@gmail.com。已经安装了 R 和 R studio 和 python。全部配置为在命令提示符下工作。 Windows 10。
    • @Professor 你可以在我的Github上找到github.com/LucasMMota/datasus-data-extractor
    【解决方案2】:

    在 python 中有这个很棒的库https://pypi.org/project/cantools/

    您可以通过它的源代码找到需要提取的字段:https://github.com/eerimoq/cantools/tree/f120d35e1523201b6d87e87306457bf1769330e3

    消息和信号的所有相关字段都可以在此 github 链接的 cantools/database/can/message.py 和 /database/can/signal.py 中找到

    例如:如果您需要信号的名称和单位,您可以使用 signal.name 和 signal.unit

    提取这些字段的示例代码:

     #**dbc_file** is the full path of dbc 
        db = cantools.database.load_file(dbc_file)
        for msg in db.messages:
            msg_name = msg.name
            msg_id = msg.frame_id
            msg_length = msg.length
            sender = msg.senders
            msg_group = db.get_message_by_name(msg_name)
        
            for signal in msg_group.signals:
                
                #name of signal
                sig_name = signal.name
                #unit of signal
                sig_unit = signal.unit
    

    希望这可能对某人有所帮助!

    【讨论】:

      【解决方案3】:

      我不知道任何可以进行实际转换的东西,但假设您指的是 DBC BUS 格式,有一个 Python 库可以读取:https://pypi.org/project/cantools/

      而且 Python 有用于编写 CSV 的内置工具:https://docs.python.org/3/library/csv.html

      只需几行代码就可以将这些库组合成一个转换器。

      【讨论】:

      • 我试过了,但没有处理 Datasus 的 DBC 文件。当使用为读取这些文件而开发的 R 脚本并将其与 python 结合使用时,我可以实现这一点。
      【解决方案4】:

      将其转换为 XLS(microsoft excel),然后您可以将其转换为 .csv,我是 ubuntu 人,但我相信应该有一个导出选项。或者至少在 LibreOffice 中有

      【讨论】:

      • 这无济于事,因为从 .DBC 转换为任何类型的问题仍然存在,因为很难找到好的库来做到这一点。
      【解决方案5】:

      如果您在 Linux 上使用 python,其中一种选择是使用位于此存储库中的项目:https://github.com/greatjapa/dbc2csv

      它的工作原理是创建一个 docker 运行 bash 脚本,然后运行 ​​python 脚本(您也可以单独运行它们,而不使用 docker,这也可以)。

      还值得注意的是,Datasus 使用的 .dbc 扩展名是他们自己创建的(与 cantools 和其他此类工具使用的 .dbc 无关),这只是让它使用起来很痛苦。

      【讨论】:

      • 感谢提供此贡献和存储库
      猜你喜欢
      • 2021-08-14
      • 1970-01-01
      • 2021-09-11
      • 2013-04-16
      • 2014-07-24
      • 2013-12-04
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      相关资源
      最近更新 更多