0

我正在分析数据提要,其中的数据有点像这样

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 是内存的类型。但是您可以看到的问题是这些非常不规则(有些条目有一些字段而没有其他字段,有时空格用作分隔符,有时,是 s,有时-是 s)。我的第一反应是使用正则表达式,但我很快意识到这很愚蠢。然后我认为我可以split在分隔符上(,在上述情况下),但即使分隔符也不是固定的。此外,这种方法对于像这样的条目将无用memory 4 GB 1333 MHz DDR3使用空格作为该条目的分隔符会使它看起来4 GB 1333 MHz 不同,但实际上4 GB1333 MHz是不同的。另外,我如何以编程方式决定Intel Core i3,,并暗示英特尔酷睿 i3?我知道我必须告诉图书馆一次,并且意思相同。但后来分析文本时应该能够弄清楚。上面提到的条目列表显示了条目的可变性。是否有一些 python 库(或任何其他语言)可以帮助我处理这些任务?Core i3i3-380Ci3Intel Core i3Core i3Ci3

4

2 回答 2

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])

然后尝试每一堂课,直到适合。

于 2012-08-04T18:49:03.160 回答
2

首先,您确定没有其他系统的方法可以获取设备信息吗?大多数系统实用程序都提供了一种标准化的信息导出方式。

如果您绝对必须解析这种结构,您将不得不使用正regex表达式来处理这种结构松散的文档。

虽然本文档通常没有统一的结构,但本文档中的每一行都有自己的标准化结构。

逻辑:

1) 一次解析文件一行。2) 读取第一个标记并使用该方法解析该行的其余部分。

例如:如果您遇到标记“RAM”,您就会知道它后面总是跟着一个数字大小、单位和类型。

快乐编码!

于 2012-08-04T18:44:39.973 回答