본문 바로가기
컴퓨터관련

Python - 문자열 정해진 규칙대로 parsing 하기

by 기록이답이다 2016. 1. 20.
반응형

프로젝트를 수행하던 중 장비의 장애정보를 telnet에 접속하여 받아와야 하는데
모듈 작성중 아래와 같은 경우가 존재하였음.
정상적인 데이터를 받는경우

정상적인 데이터를 받지 않는경우(정해진 규칙보다 크거나 작은경우)

 

 DATA ( 구분자 "|")

 

# 정상적인 경우
1|1A|1B|1C|1D|1E||1XX|
2|2A|2B|2C|2D|2E||2XX|
3|3A|3B|3C|3D|3E||3XX|
4|4A|4B|4C|4D|4E||4XX|
5|5A|5B|5C|5D|5E||5XX|

# 비정상적인 경우
11|11A|11B|11C|11D|11E||11XX|12|12A|12B|12C|12D|12E||12XX|13|13A|13B|13C|13D|13E||13XX|14|14A|14B|14C|14D|14E||14XX|15|15A|15B|15C|15D|15E||15XX|21|21A|21B|21C|
21D|21E||21XX|

# 정상적인 경우
7|7A|7B|7C|7D|7E||7XX|&
  Python console (정상적인 경우)
>>> data = "1|1A|1B|1C|1D|1E||1XX|"

>>> dataSpl = data.split("|")

>>> print dataSpl
['1', '1A', '1B', '1C', '1D', '1E', '', '1XX', '']
>>> len(dataSpl)
9
Python console (비정상적인 경우)
>>> data = "11|11A|11B|11C|11D|11E||11XX|12|12A|12B|12C|12D|12E||12XX|13|13A|13B|13C|13D|13E||13XX|14|14A|14B|14C|14D|14E||14XX|15|15A|15B|15C|15D|15E||15XX|21|21A|21B|21C|"
>>> dataSpl = data.split("|")
>>> print dataSpl
['11', '11A', '11B', '11C', '11D', '11E', '', '11XX', '12', '12A', '12B', '12C', '12D', '12E', '', '12XX', '13', '13A', '13B', '13C', '13D', '13E', '', '13XX', '14', '14A', '14B', '14C', '14D', '14E', '', '14XX', '15', '15A', '15B', '15C', '15D', '15E', '', '15XX', '21', '21A', '21B', '21C', '']
>>> len(dataSpl)
45
>>>
처리방법
1. 데이터의 정상여부 체크
2. 정상적인 데이터의 경우 - 아무 문제 없음.
3. 비정상적인 데이터의 경우 
- data를 정해진 규칙대로 split 하여 추출한 다음 추출한 문자열을 queue에 저장, 
마지막 남은 data의 split.length가 정해진 규칙의 split.length 보다 적은경우 
나머지 데이터를 저장한 후 다시 받은 데이터의 앞부분에 이어 붙여 데이터의 유실방지
Python Source
#!/bin/env python
# -*- coding: utf-8 -*-
#
# 기능 설명 :
# TEST

import os
import time

# test용
#basicNum = 8
#txtName = "a.txt"

# itas용
basicNum = 53
txtName = "a2.txt"

fp = open("C:\\python27\\test\\%s" % txtName)
dataLine = fp.readlines()

restData = ""
for data in dataLine :
	data = data.replace("\x1b\x03", "") # garbage 데이타 삭제
	if restData != "":
		print "restData 존재하여 data앞에 붙이기"
		print "%s + %s" % (restData, data)
		data = restData + data
		restData = ""
	
	dataSpl = data.split("|")
	if len(dataSpl) -1 == basicNum : # 정상적인 데이터
		print "정상 : ", data
	elif len(dataSpl) -1 > basicNum :
		data2 = data.rstrip("\r\n");
		data2 = data2.replace("\x1b\x03", "") # garbage 데이타 삭제

		saveData = ""

		dataSpl2 = data2.split("|")

		sumCnt = 0
		tmpData = data2
		for i in range( len(dataSpl2) / basicNum ):
			tmpDataSpl = tmpData.split("|")
			for j in range(basicNum):
				saveData += tmpDataSpl[j]+"|"
				sumCnt = sumCnt+1

			print "추출한 문자 : ", saveData
			saveData = ""

			findText = dataSpl2[sumCnt]
			findIndex = data2.find(findText)

			tmpData = data2[findIndex:]
			'''
			print "검색어 : ", findText
			print "검색어 위치 ", findIndex
			print "찾아야할 문자를 찾는 방법 : tmpData = data2[%d:]" % findIndex
			print "찾은문자 : %s" % tmpData
			'''
			print ""
		restData = tmpData
		#print "restData = ", restData
		continue
	elif len(dataSpl) -1 < basicNum :
		restData = data
		continue

print ""
print "============================================="
print restData

이글을 누가 볼지 모르겠지만 혹시나 첨부파일이 필요한경우 댓글로 요청하시면 등록해드리겠습니다.
반응형