1

かなり古いシステムから生成されたログ ファイルから個々のレコードを抽出し、データベースに入力できるようにする必要があります。私が抽出できるのはこれらのフラット ファイルだけです (そして、クエリをフォーマットするだけで数週間かかりました)。以下は、2 つのレコードを持つファイルの例です。私が見る唯一の区切り文字は「/11 S11-」で、それ自体は 5 文字の通常の場所にありますが、先頭または末尾ではありません。

見ている人にとっては、はい、これは私の他の初心者の質問に関連しています。Python のドキュメント、いくつかの Google の結果、およびいくつかの関連する 質問を見てきました。だから、私の質問は

a) レコード内で 5 文字から始まる区切り文字を使用する方法は?

b) 自然言語のこれらの大きな塊をどのようにつかむのですか?

c) 改行の後の空白を取り除く方法は? これはおそらく最も簡単な部分です。各フィールドの長さをクエリで指定できます。現在、accessionDate は 10 文字、accessionNumber は 10 文字、patMedicalRecordNum は 15 文字です。したがって、finalDxText の空白は 35 文字です。

01/01/11  S11-55555 20/444-55-6666 A.  PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:                           
                                   -  ADENOCARCINOMA.                                                      

                                   TOTAL GLEASON SCORE:  GLEASON 5+4=9                                     
                                   TUMOR LOCATION:  BILATERAL                                              
                                   TUMOR QUANTITATION:  15% OF PROSTATE INVOLVED BY TUMOR
                                   EXTRAPROSTATIC EXTENSION:  PRESENT AT RIGHT POSTERIOR                   
                                   SEMINAL VESICLE INVASION:  PRESENT                                      
                                   MARGINS:  UNINVOLVED                                                    
                                   LYMPHOVASCULAR INVASION:  PRESENT                                       
                                   PERINEURAL INVASION:  PRESENT                                           
                                   LYMPH NODES (SPECIMENS B AND C):                                        
                                      NUMBER EXAMINED:  25                                                 
                                      NUMBER INVOLVED:  1                                                  
                                      DIAMETER OF LARGEST METASTASIS:  1.7 mm                              
                                   ADDITIONAL FINDINGS:  HIGH-GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA,   
                                      ACUTE AND CHRONIC INFLAMMATION, INTRADUCTAL EXTENSION OF INVASIVE    
                                      CARCINOMA                                                            

                                   PATHOLOGIC STAGE:  pT3b N1 MX                                           

                               B.  LYMPH NODES, RIGHT PELVIC, EXCISION:                                    
                                   -  ONE OF SEVENTEEN LYMPH NODES POSITIVE FOR METASTASIS (1/17).         

                               C.  LYMPH NODES, LEFT PELVIC, EXCISION:                                     
                                   -  EIGHT LYMPH NODES NEGATIVE FOR METASTASIS (0/8).                     
01/02/11  S11-4444 20/111-22-3333 PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:                               
                                  - ADENOCARCINOMA.                                                        
                                    GLEASON SCORE:  3 + 3 = 6 WITH TERTIARY PATTERN OF 5.                                             
                                    TUMOR QUANTITATION:  APPROXIMATELY 10% BY VOLUME.                      
                                    TUMOR LOCATION:  BILATERAL.                                            
                                    EXTRAPROSTATIC EXTENSION:  NOT IDENTIFIED.                             
                                    MARGINS:  NEGATIVE.                                                    
                                    PERINEURAL INVASION:  IDENTIFIED.                                      
                                    LYMPH-VASCULAR INVASION:  NOT IDENTIFIED.                              
                                    SEMINAL VESICLE/VASA DEFERENTIA INVASION: NOT IDENTIFIED.              
                                    LYMPH NODES:  NONE SUBMITTED.                                          
                                    OTHER:  HIGH GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA.                
                                   PATHOLOGIC STAGE (pTNM):  pT2c NX. 
4

3 に答える 3

2

区切り記号

私はフックから外れているかもしれませんが、あなたの記録を見て、具体的には01/01/11 S11-55555 20/444-55-666601/01/11私にはデートのように見えます.

したがって、あなたの入力から判断すると:

  • mm/dd/yyたとえば、非常に単純な正規表現とre.match.
  • 各レコードのデータがインデントされているように見えるので、インデントされていない行は区切り記号のようです。

空白

my_string.stripmy_string先頭と末尾の空白を取り除いて返します。

于 2012-06-01T20:54:15.303 に答える
1

I'd try something like this:

import re                                # regex module

in_string = """Text from above"""

records = []                             # list to store all records in order
record = ""                              # string to store current record

for line in in_string.splitlines():      # go through each line of the input
    if re.match('\d\d/\d\d/\d\d',line):  # match the date at the start 
        records.append(record)           # add current record to list
        record = ""                      # start new current record
    record += line.strip()               # add line (without whitespace) to current record
records.append(record)                   # add last record to records list

This outputs the following:

['',

'01/01/11 S11-55555 20/444-55-6666 A. PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:- ADENOCARCINOMA.TOTAL GLEASON SCORE: GLEASON 5+4=9TUMOR LOCATION: BILATERALTUMOR QUANTITATION: 15% OF PROSTATE INVOLVED BY TUMOREXTRAPROSTATIC EXTENSION: PRESENT AT RIGHT POSTERIORSEMINAL VESICLE INVASION: PRESENTMARGINS: UNINVOLVEDLYMPHOVASCULAR INVASION: PRESENTPERINEURAL INVASION: PRESENTLYMPH NODES (SPECIMENS B AND C):NUMBER EXAMINED: 25NUMBER INVOLVED: 1DIAMETER OF LARGEST METASTASIS: 1.7 mmADDITIONAL FINDINGS: HIGH-GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA,ACUTE AND CHRONIC INFLAMMATION, INTRADUCTAL EXTENSION OF INVASIVECARCINOMAPATHOLOGIC STAGE: pT3b N1 MXB. LYMPH NODES, RIGHT PELVIC, EXCISION:- ONE OF SEVENTEEN LYMPH NODES POSITIVE FOR METASTASIS (1/17).C. LYMPH NODES, LEFT PELVIC, EXCISION:- EIGHT LYMPH NODES NEGATIVE FOR METASTASIS (0/8).',

'01/02/11 S11-4444 20/111-22-3333 PROSTATE AND SEMINAL VESICLES, PROSTATECTOMY:- ADENOCARCINOMA.GLEASON SCORE: 3 + 3 = 6 WITH TERTIARY PATTERN OF 5.TUMOR QUANTITATION: APPROXIMATELY 10% BY VOLUME.TUMOR LOCATION: BILATERAL.EXTRAPROSTATIC EXTENSION: NOT IDENTIFIED.MARGINS: NEGATIVE.PERINEURAL INVASION: IDENTIFIED.LYMPH-VASCULAR INVASION: NOT IDENTIFIED.SEMINAL VESICLE/VASA DEFERENTIA INVASION: NOT IDENTIFIED.LYMPH NODES: NONE SUBMITTED.OTHER: HIGH GRADE PROSTATIC INTRAEPITHELIAL NEOPLASIA.PATHOLOGIC STAGE (pTNM): pT2c NX.']

Note: This is a crappy regular expression and will match any line that starts with "nn/nn/nn"

You'll probably want to add in a space between rows - something like record += line.strip()+' '

Good luck!


You can muck around with Regular Expressions (regex/re) here - put your regular expression (ie \d\d/\d\d/\d\d S11) in the top box, and your text in the bottom one.

于 2012-06-01T21:10:45.460 に答える
1

これはアイデアです:

 chunky = open(file, 'r')
    for line in chunky:
        if line>'00':                            # It's a starting line
            linedata = line.split(None, 3)       # separates line in four pieces
            chunk = linedata[3].strip()
        else:
            chunk += ' ' + line.strip()

そして、newb: a part of a string: line[a:b] の場合、a は 0 から始まる必要がある最初のもので、b は必要のない最初のものです。S11 は linedata[1][0:3] になります

于 2012-06-01T21:15:55.597 に答える