我有一个很大的非矩形文本文件,我需要从中提取数据。我更喜欢用Python做,但Matlab也很好。 我想从以下示例中的“相关”名称中提取的数据如下所示:
CLASS MIKE(2栏)
01 02(CLASS和MIKE的最后2个数字)
03 04
05 06
下面是文本文件的示例,名称为“related”的段落随机出现。每条记录用两个空行分隔。
-CLASS 36463601
-NAME RELEVANT
-FAX -PHONE OSCAR -NO 36468500
-FAX -PHONE LIMA -NO 745674600
-FAX -PHONE DELTA -NO 46778400
-FAX -PHONE MIKE NO 74757502
-HOME 3232
-CLASS 36463603
-NAME RELEVANT
-FAX -PHONE OSCAR -NO 36468500
-FAX -PHONE LIMA -NO 745674600
-FAX -PHONE DELTA -NO 46778400
-FAX -PHONE BRAVO -NO 46778400
-FAX -PHONE MIKE NO 74757504
-HOME 3232
-CLASS 36463600
-NAME NOT RELEVANT
-FAX -PHONE OSCAR -NO 36468500
-FAX -PHONE LIMA -NO 745674600
-FAX -PHONE DELTA -NO 46778400
-FAX -PHONE BRAVO -NO 46778400
-FAX -PHONE MIKE NO 74757503
-HOME 3232
-CLASS 36463605
-NAME RELEVANT
-FAX -PHONE OSCAR -NO 36468500
-FAX -PHONE LIMA -NO 745674600
-FAX -PHONE DELTA -NO 46778400
-FAX -PHONE BRAVO -NO 46778400
-FAX -PHONE MIKE NO 74757506
-HOME 3232
非常感谢任何输入。
答案 0 :(得分:0)
嗯,你没有尝试任何事情,所以我没有提供任何代码。但我可以分享用于解析数据的算法。有了这个,我相信当你遇到实施问题时,你应该能够提出具体的问题。此外,我试图接近pythonic表达式,所以一切都应该很容易转换为实际的代码。
这将遍历整个文件和缓冲行,最多两个空行。然后在处理过程中存在相关行的情况下存储缓冲区。它实际上是一个简单的状态机。 lines
和relevant_records
可以是python列表。
1. For each `line` in text file:
1.1. if `line` is empty then `empty_lines++` else append `line` to `lines`.
1.2. if `empty_lines == 2` then:
1.2.1. if `record_relevant` then output/save `lines`
(e.g relevant_records.append(lines))
1.2.2. `record_relevant = false`
1.2.3. `empty_lines = 0`
1.2.4. `lines = []` #clear buffer
1.3. if `line` contains `NAME RELEVANT` then `record_relevant = true`.
如果后面没有两个空行,你也应该在最后一次记录后调用1.2.1-4
。
您可以将其分组为函数和类,以使其更漂亮,更好地设计和维护。