解析复杂的文本文件,以便在Python中进行数据分析

时间:2013-01-24 16:03:49

标签: python parsing text

我是Python或编程的完全新手。

我有一个文本文件要解析为CSV。我目前无法提供文本文件的示例。

  1. 文本是几(千)行,没有回车符。
  2. 文件中有4种类型的记录(A,B,C或I)。
  3. 每种记录类型都有基于数据元素大小的特定格式。
  4. 没有分隔符。
  5. 在记录类型中的最后一个数据元素之后,立即显示下一个记录类型。
  6. 我一直试图用不同的语言翻译Python中可能会出现的样子。
  7. 这是我写的一个例子(格式不正确)

    file=open('TestPython.txt'), 'r' # from current working directory
    dataString=file.read()
    data=()
    i=0
    while i < len(dataString):
    i = i+2
        curChar = dataString(i)
        # Need some help on the next line var curChar = dataString[i]
    
        if curChar = "A"
            NPI = dataString(i+1, 16) # Need to verify that is how it is done in python inside ()
                NPI.strip()
            PCN = datastring(i+17, 40)
                PCN.strip()
            seqNo = dataString(i+41, 42)
                seqNo.strip()
            MRN = dataString(i+43, 66)
                MRN.strip()
        if curChar = "B"
            NPI = dataString(i+1, 16) # Need to verify that is how it is done in python inside ()
                NPI.strip()
            PCN = datastring(i+17, 40)
                PCN.strip()
            seqNo = dataString(i+41, 42)
                seqNo.strip()
            RC1 = (i+43, 46)
                RC1.strip()
            RC2 = (i+47, 50)
                RC2.strip() 
            RC3 = (i+51, 54)
                RC3.strip()
        if curChar = "C"
            NPI = dataString(i+1, 16) # Need to verify that is how it is done in python inside ()
                NPI.strip()
            PCN = datastring(i+17, 40)
                PCN.strip()
            seqNo = dataString(i+41, 42)
                seqNo.strip()
            DXVer = (i=43, 43)
                DXVer.strip()
            AdmitDX = (i+44, 50)
                AdmitDX.strip()
            RVisit1 = (i+51, 57)
                RVisit1.strip()
    

    这是一段文本文件的Dummied-up版本。

    A 63489564696474677 9845687 777 67834717467764674 TUANU TINBUNIU 47 ERTYNU TDFGH UU748897764 66762589668777486U6764467467774767 7123609989 9 O
        B 79466945684634677 676756787344786474634890 7746.66 7 96 4 7 7 9 7 774666 44969 494 7994 99666 77478 767766
        B 098765477 64697666966667 9 99 87966 47798 797499
        C 63489564696474677 6747494 7494 7497 4964 4976 N7469 4769 N9784 9677
        I 79466944696474677 677769U6 8888 67764674
        A 79466945684634677 6767994 777 696789989 6464467464764674 UIIUN UITTI 7747 NUU 9 ATU 4 UANU OSASDF NU67479 66567896667697487U6464467476777967 7699969978 7699969978 9 O

    如您所见,文件中可以有多种类型。这个示例粘贴的方式,看起来类型是一行中的第一个字符。实际文件不是这种情况(我在Word中制作了这个示例)。

2 个答案:

答案 0 :(得分:2)

您可以查看pyparsing

答案 1 :(得分:0)

您最好在阅读时处理该文件。

首先,执行file.read(1)以确定接下来要记录的记录类型。

然后,根据类型,读取字段,如果我理解你正确的是固定宽度。所以对于类型'A',这看起来像这样:

def processA (file):
    NPI = file.read(16).strip()  #assuming the NPI is 16 bytes long 
    PCN = file.read(23).strip()  #assuming the PCN is 23 bytes long
    seqNo = file.read(1).strip() #assuming seqNo is 1 byte long
    MRN = file.read(23).strip()  #assuming MRN is 23 bytes long
    return {"NPI":NPI,"PCN":PCN, "seqNo":seqNo, "MRN":MRN}

如果文件不是ASCII,则需要更多的工作来使编码正确并读取字符而不是字节。