2009-08-07 104 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