2010-07-31 3 views
0

큰 데이터베이스 인 ~ 300MB의 mysqldump를 수행했습니다. 그래도 오류가 발생했습니다. <o:p>...</o:p> 태그에 포함 된 따옴표를 이스케이프 처리하지 않았습니다. 다음은 샘플입니다 :특정 html 태그 내에 포함 된 인용문을 이스케이프 처리합니다.

...Text here\' escaped correctly, <o:p> But text in here isn't. </o:p> Out here all\'s well again... 

는 스크립트 작성 가능 (바람직하게는 파이썬에서,하지만 난 아무것도 할게요!) 검색하고 자동으로 이러한 오류를 고칠 수있을 것인가? 꽤 많은 파일이 있고 Notepad ++는 그 크기의 파일을 잘 처리 할 수 ​​없습니다 ...

+0

파이썬에서는 꽤 쉽습니다. 1 시간 정도, 상판. 파이썬이 정말 재미 있기 때문에 직접 스크립트를 만드는 것이 좋습니다! :) –

답변

4

"파일"이 적절한 길이로 분할되어 있고 이진 시퀀스가없는 경우 그렇지 않으면

import re 
    import fileinput 

    tagre = re.compile(r"<o:p>.*?</o:p>") 
    def sub(mo): 
    return mo.group().replace(r"'", r"\'") 

    for line in fileinput.input('thefilename', inplace=True): 
    print tagre.sub(sub, line), 

, 당신은 "현재 위치에서 시뮬레이션해야합니다 :"텍스트로 읽는 것은 "휴식 것이, 당신은 fileinput의 편리"하게 나는 곳에서 파일을 다시 작성하고있어 믿는다 "기능을 사용할 수 있습니다 재작 성 "자신, 예. (... 간략화 됨) :

with open('thefilename', 'rb') as inf: 
    with open('fixed', 'wb') as ouf: 
     while True: 
     b = inf.read(1024*1024) 
     if not b: break 
     ouf.write(tagre.sub(sub, b)) 

을 다음 'thefilename'의 자리를 차지할 'fixed' 이동 (중, 또는 수동으로 코드에서) 당신은 파일 이름이 고정 후 남아있는 것을 필요로하는 경우.

중요한 <o:p> ... </o:p> 부품 중 하나가 두 개의 연속 메가 바이트 "블록"으로 나뉘어 결국 식별되지 않을 수 있기 때문에 과도하게 단순화됩니다 (첫 번째 예에서는 각 부품이 항상 " 라인 "- 그게 아니라면 그 코드를 사용해서는 안되지만, 다음은 어쨌든). 이 문제를 해결하려면, 아, 더 복잡한 코드가 필요합니다 ... :

with open('thefilename', 'rb') as inf: 
    with open('fixed', 'wb') as ouf: 
     while True: 
     b = getblock(inf) 
     if not b: break 
     ouf.write(tagre.sub(sub, b)) 

partsofastartag = '<', '<o', '<o:', '<o:p' 
    def getblock(inf): 
    b = '' 
    while True: 
     newb = inf.read(1024 * 1024) 
     if not newb: return b 
     b += newb 
     if any(b.endswith(p) for p in partsofastartag): 
     continue 
     if b.count('<o:p>') != b.count('</o:p>'): 
     continue 
     return b 

당신이 보듯이 꽤 섬세한 코드이며, 따라서, 검증되지 않은 인 무엇, 나는 그것은 당신의 문제에 대한 올바른를 알 수 없다. 특히 의 케이스가 닫음 </o:p>과 일치하지 않거나 그 반대의 경우가있을 수 있습니까? 그렇다면 getblock에 대한 호출은 매우 비싼 방법으로 전체 파일을 반환 할 수 있으며 RE 일치 및 대체가 역효과를 일으킬 수도 있습니다 (후자는 이러한 태그의 작은 따옴표 중 일부가 이미 올바르게 이스케이프 된 경우에도 발생합니다 전부는 아니지만). 당신이 모든 훨씬 간단 코드 만들기, 메모리에 맞아야하기 때문에 정도, 블록 분할되는 민감한 문제를 피하고, 적어도, 가능하다 적어도 GB 경우

그러나

with open('thefilename', 'rb') as inf: 
    with open('fixed', 'wb') as ouf: 
     b = inf.read() 
     ouf.write(tagre.sub(sub, b)) 

을, 위에서 언급 한 다른 문제 (불균형 개폐 태그가있을 수 있음)가 남아있을 수 있습니다. 기존 결함 데이터를 연구하고 수정할 수있는 합리적으로 간단한 방법을 찾아 볼 수 있습니다!

+0

고마워, 그 위대한, 내가 지금해야 할 일은 그들을 찾을 수있는 편리한 방법이없는 이스케이프 숨겨진 따옴표로 다른 모든 쿼리를 찾을 수 있습니다 ... – fredley

관련 문제