使用python解析从不一致的对象名称

时间:2017-06-08 20:49:28

标签: python parsing

/ tldr希望解析大量文件名,这些文件名是两个名称(容器+子)的串联,用于原始的两个名称,其中命名不一致。 Python库建议或任何其他指导意见。

我正在寻找一种方法来解析字符串以获取信息,其中这些字符串中的信息的命名和格式可能会在某种程度上不一致。

背景 行业:自动化控制

要解决的问题:
时间序列数据从自动化系统导出,单个数据点保存到单个.csv文件中。 (例如:如果控制系统是环境控制系统,那么点可能是以15分钟为间隔的房间的测量温度。)可能有一个环境,其中有几十个点导出到CSV文件或几个导出为CSV文件的千分。点通常存储的结构如下:点包含在控制器内,控制器集成在管理系统下,偶尔管理系统可以集成到另一个管理系统中。生成的结构是一个简单的分层树。

与CSV文件关联的文件名是从每个点的路径结构汇编而成,如下所示:为管理系统创建目录(必要时嵌套),在这些目录下是CSV文件,其中文件名是串联的控制器名称和点名称。

我编写了一个python脚本,用于处理CSV文件(目前大约5500个[正在增长])每月导出到结构化数据存储中,另一个用于组装电子表格以供其他人查看。目前,我正在使用一些非常丑陋的正则表达式,甚至更丑陋的string.find()和一个静态字符串值列表,我手工输入这些值来解析每个文件的控件名称和点名称,以便它们可以插入到结构化数据存储。

不幸的是,如上所述,这些环境中使用的命名法很少是一致的。点名称差异很大。上面提到的点可能被称为ROOMTEMP,RM_T,RM-T,ROOM-T,ZN_T,ZNT,RMT或其他几种可能性。这几乎适用于控制器中包含的任何点。控制器名称也有些不一致,它们可以根据它们控制的设备类型,设备的地理位置或与设备关联的资产编号进行命名。

我非常希望每次添加新位置时都不要手工编写正则表达式来解析文件名。我想编写读取文件名并在文件名中查找模式的代码,然后建议解析控制器和每个文件名中的点名。我已经有了一个界面,我可以手动为每个点对象分配控制器名称和点名称,所以如果解析出错,我可以修改结果。理想情况下,现有对象创建的模式会影响正在解析的新文件的建议名称。

文件名的一些示例如下: UNIT1254_SAT.csv,UNIT1254_RMT.csv,UNIT1254_fil.csv,AHU_5311_CLG_O.csv,QE239-01_DISCH_STPT.csv,HX_E2_CHW_Return.csv,Plant_RM221_CHW_Sys_Enable.csv,TU_E7_Actual CLG Setpoint.csv,1725_ROOMTEMP.csv,1725_DA_T.csv,1725_RA_T.csv

在控制器名称和点名称的串联中,顺序始终是一致的。很可能是一个一致的字符,用于将控制器名称与点名称分开(通常是下划线,但偶尔也是破折号或其他字符。)

有没有人对如何开始解析这些文件名有任何建议?我已经考虑了一些想法,但是在实施之前继续搁置它们,因为我一直在发现性能问题或识别故障点的可能性。我的其余代码几乎按照我需要的方式工作,我只是没有想出一个有效或有用的方法从文件名中提取正确的名称。不幸的是,不能修改控制系统端的名称以保持一致。

1 个答案:

答案 0 :(得分:0)

我不知道以下代码是否会对您有所帮助,但我希望它至少会给您一些想法。

考虑到文件名为“QE239-01_STPT_1725_ROOMTEMP_DA”可以包含以下名称
 'QE239-01'
 'QE239-01_STPT'
 'QE239-01_STPT_1725'
 'QE239-01_STPT_1725_ROOMTEMP'
 'QE239-01_STPT_1725_ROOMTEMP_DA'
 'STPT'
 'STPT_1725'
 'STPT_1725_ROOMTEMP'
 'STPT_1725_ROOMTEMP_DA'
 '1725'
 '1725_ROOMTEMP'
 '1725_ROOMTEMP_DA'
 'RoomTemp的'
 'ROOMTEMP_DA'
 'DA'
作为文件名的可能元素(容器名称或点名称), 我定义了函数git add . 以从名称返回此列表。

然后代码会处理所有文件名以查找文件名的所有可能元素。 该函数基于以下思想:在所选示例中,元素ROOMTEMP不能跟随元素STPT,因为STPT_ROOMTEMP在此示例字符串中不是可能的容器名称,因为这两个元素之间存在1725。

然后,在treat()模块中的函数的帮助下,我尝试区分可能具有某些相似性的元素,以便尝试检测可以收集多个名称元素的模式。

您必须使用作为参数传递给difflib参数的值来选择最适合您的结果。

当然,这远非好,但我并不了解你问题的所有方面。

cutoff