2009-08-07 144 views
0

我正在處理清理相對較大(30行)的文本塊。下面是摘錄:用Python替換大字符串中字符的最佳方法?

PID | 1名|| 06225401 ^^^ PA0^MR ||患者^ FAKE [R |||˚F

PV1 | 1 |我||||| 025631^DoctorZ ^^^^^^^ PA0 ^^^^ DRH | DRH |||| ...

ORC | RE || CYT-09-06645^AP |||||| 200912110333 | INTERFACE07

OBR | 1 || CYT09-06645 | 8104 ^^ |||大號20090602 ||||||| 200906030000 [conditio ...

OBX | 1 | TX | 8104 | 1 |作者 的源PECIMEN:[來源] ||||||˚F||| 200912110333 | CYT ...

我現在有一個腳本,它非法字符或條款。這是一個例子。

infile = open(thisFile,'r') 
    m = infile.read() 

    #remove junk headers 
    m = m.replace("4þPATHþ", "") 
    m = m.replace("10þALLþ", "") 

我的目標是修改此腳本,以便我可以將4位數字添加到其中一個字段的末尾。具體而言,OBR行中的日期字段(「20090602」)。完成的腳本將能夠處理任何遵循相同格式的文件。這可能與我目前處理文件輸入的方式,還是我必須使用一些不同的邏輯?

+0

這個問題並不完全清楚。你能提供樣本輸入和輸出嗎? – 2009-08-07 00:22:30

+1

那些垃圾頭可以更好地表達爲例如「4 \ xfePATH \ xfe」可以很簡單地表明所謂的「非法字符」不是字符(既不是冰島小寫字母也不是拉丁文小寫字母p(這是乍看之下的樣子)),而是二進制垃圾。 – 2009-08-07 01:03:08

回答

2

這裏有一個大綱(未經測試)......基本上你有一條線在時間上面

for line in infile: 
    data = line.rstrip("\n").split("|") 
    kind = data[0] 
    # start of changes 
    if kind == "OBR": 
     data[7] += "0000" # check that 7 is correct! 
    # end of changes 
    outrecord = "|".join(data) 
    outfile.write(outrecord + "\n") 

假設你是線型選擇修復行動目標(例如:「OBR」)和列索引(例如:7)。如果只有少數這樣的目標,只需添加更多類似的修復語句即可。如果有許多目標,你可以像這樣指定它們:

fix_targets = { 
    "OBR": [7], 
    "XYZ": [1, 42], 
    } 

和fix_up代碼是這樣的:

if kind in fix_targets: 
    for col_index in fix_targets[kind]: 
     data[col_index] += "0000" 

你可能喜歡在任何情況下將代碼添加到檢查數據[ col_index]在更改之前確實是YYYYMMDD格式的日期。

上述任何地址都不會刪除不需要的標題,因爲您沒有顯示示例數據。我想猜想,將替代品應用到每一行(並避免寫入行,如果它成爲替換後只有空白)將做的伎倆。

+0

完美。我想這可能是這樣的,但我真的無法想象它。感謝你的回答。 – Sean 2009-08-07 00:37:20

+1

好。 OUTFILE。寫(outrecord +'\ n')有一個內置的Python等價物:print >> outfile,outrecord,這更簡單。 – EOL 2009-08-07 08:02:35

+1

@EOL - 除了不經常使用的「print chevron」語法也被棄用。 – JimB 2009-08-07 13:35:09