【问题标题】:Parse complex text file for data analysis in Python在 Python 中解析复杂的文本文件以进行数据分析
【发布时间】:2013-01-24 16:03:48
【问题描述】:

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

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

  1. 文本是几(千)行,没有回车。
  2. 文件中有 4 种类型的记录(A、B、C 或 I)。
  3. 每种记录类型都有基于数据元素大小的特定格式。
  4. 没有分隔符。
  5. 紧跟记录类型中的最后一个数据元素之后,会出现下一个记录类型。
  6. 我一直在尝试从另一种语言翻译它在 Python 中的样子。

这是我写的一个例子(格式不正确)

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()

这是一段文本文件的虚拟版本。

A 63489564696474677 9845687 777 67834717467764674 TUANU TINBUNIU 47 ERTYNU TDFGH UU748897764 66762589668777486U6764467467774767 712360998
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
我 79466944696474677 677769U6 8888 67764674
甲79466945684634677 6767994 777 696789989 6464467464764674 UIIUN UITTI 7747 NUU 9 ATU 4 UANU OSASDF NU67479 66567896667697487U6464467476777967 7699969978 7699969978 9 O P>

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

【问题讨论】:

  • 您至少需要提供某种格式的抽象,否则问题将无法回答。
  • 如果我没看错的话,你可以先将整个文件压缩成一个字符串。这有点疯狂,您应该只将少量内容读入内存并进行处理。
  • 您应该可以尝试使用python的python CSV模块:docs.python.org/2/library/csv.html,它可能允许您在一行中读取数据...
  • 从技术上讲,我不太确定这是一个 CSV 文件。
  • @flup:它还不是 CSV 文件。这似乎是他想要转换为新的 CSV 文件的固定宽度数据集流。

标签: python parsing text


【解决方案1】:

你可以看看pyparsing

【讨论】:

  • 没错,但它并不完全是初学者的东西。
【解决方案2】:

您最好在阅读文件时对其进行处理。

首先,执行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,则需要做更多工作才能正确编码并读取字符而不是字节。

【讨论】:

  • 谢谢。是的,我试图将整个文件变成一个字符串...... Wild 不是我想要的。 def processA(文件):看起来可以尝试。
  • 执行 file.read(1) 时出现属性错误:“元组”对象没有“读取”属性。这是文本文件不是ASCII吗?还是我需要再次点击教程(无论如何我都会)。
  • 不,打开文件时有一点错别字。它应该是file=open('TestPython.txt', 'r')。注意右括号。您的语句会生成一个包含打开文件和“r”的元组。
猜你喜欢
  • 2012-11-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-10
  • 1970-01-01
  • 2018-06-07
  • 2019-07-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多