2013-01-24 31 views
0

我是Python或編程的完全新手。在Python中解析用於數據分析的複雜文本文件

我有一個文本文件解析成CSV。我目前無法提供文本文件的示例。

  1. 該文本是幾(千)行沒有回車。
  2. 文件中有四種類型的記錄(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() 

這裏有一個空置的後續版本一塊文本文件中。

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

正如你可以看到,可以有幾個文件中的每個類型的。這個例子粘貼的方式,看起來類型是一行上的第一個字符。實際文件(我在Word中創建此示例)不是這種情況。

+1

您需要提供至少某種格式的抽象或問題變得無可辯駁。 – root

+1

如果我正確讀取它,則首先將整個文件抽成一個字符串。這有點瘋狂,你應該只在內存中讀取一點點並處理它們。 – flup

+0

您應該嘗試使用python的python CSV模塊:http://docs.python.org/2/library/csv.html,它可能允許您在一行中讀入數據... – Alex

回答

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,還有更多的工作,以獲得正確的編碼和讀取字符,而不是字節。

+0

謝謝。是的,我試圖把整個文件轉換成一個字符串...... Wild不是我想要的。 def processA(文件):看起來像是要嘗試的東西。 – JSamp

+0

當我做file.read(1)時,我得到一個屬性錯誤:'元組'對象沒有'read'屬性。這是文本文件不是ASCII?或者我需要再次點擊教程(反正我會的)。 – JSamp

+0

不,打開文件時會出現一個小錯字。它應該讀取'file = open('TestPython.txt','r')'。注意右括號。您的語句生成一個包含打開文件和'r'的元組。 – flup

2

你可以看看pyparsing

+0

的確如此,但它並不完全是初學者的東西。 – flup

+0

@flup:點好吃。 – seandavi

+0

+1作爲標題中問題的答案,儘管它是最好的。 – flup