我正在分析数据源,其数据有点像这样
RAM 4 GB DDR3
RAM 16GB DIMM
memory 4GB DDR3 MHz // no value for MHz
memory 4GB DDR3 1333 MHz // no the order of MHz is not fixed
ram 6GB, 1333 MHz, DDR3 // comma used as delimiter
Processor Intel Core i7-3612QM
Processor Intel Core i7 2630QM
processor i3-380,2.53 GHz //380 used for model number instead of 380M and model number separated by '-' and clock speed separated by ','
Processor Core i3-380 2.53 GHz
Processor Intel Ci3 - 2330 (2nd Gen), 2.53 GHz // multiple symbols used as delimiters(',','-')
Hard drive 500GB 5400RPM
Hard Disk Drive 1.5 TB
Hard Disk 256 GB
现在我需要分析ram 6GB, 1333 MHz, DDR3
中每个规范的含义我需要弄清楚6GB是容量,1333 MHz是频率,DDR3是ram的类型。但是你可以看到的问题是这些是非常不规则的(一些条目有一些字段而没有其他字符,有时空格用作分隔符,有时是,
s,有时是-
s。我的第一反应是使用正则表达式,但我很快意识到它是愚蠢的。然后我认为我可以split
在分隔符(,
上面的情况下),但即使分隔符也不固定。此方法对此类条目也无用memory 4 GB 1333 MHz DDR3
使用空格作为此条目的分隔符会使其看起来像4
GB
1333
MHz
不同但实际上4 GB
和1333 MHz
是不同的。
另外,我如何以编程方式确定Intel Core i3
,Core i3
,i3-380
和Ci3
是否意味着英特尔酷睿i3?我知道我必须告诉图书馆,Intel Core i3
,Core i3
和Ci3
意味着同样的事情。但后来在分析文本时应该能够弄明白。
上面提到的条目列表显示了条目的变量。是否有一些python库(或任何其他语言)可以帮助我处理这些任务?
答案 0 :(得分:3)
如果你能够构建一组直接对应于每种类型的条目的类,那么这可能是要走的路。例如,RAM的类可能是:
class Memory:
def __init__(self, s):
if not 'RAM' in s and not 'memory' in s:
raise ValueError("Not a string that describes RAM.")
self.capacity = int(re.match(r'(\d+) ?GB', s)[1])
然后尝试每个课程直到一个人适合。
答案 1 :(得分:2)
首先,您确定没有其他系统方法来获取设备信息吗?大多数系统实用程序提供了导出信息的标准方法。
如果您绝对必须解析此结构,则必须使用regex
或正则表达式来处理此类结构松散的文档。
虽然本文档一般没有统一的结构,但本文档中的每一行都有自己的标准化结构。
逻辑:
1)一次解析一行文件。 2)读取第一个令牌并使用该方法解析该行的其余部分。
例如:如果您遇到令牌“RAM”,您知道它后面跟着一个数字大小,单位,然后是类型。
快乐的编码!