Skip to content

Instantly share code, notes, and snippets.

@rahulsom
Created November 25, 2013 23:55
Show Gist options
  • Select an option

  • Save rahulsom/7651053 to your computer and use it in GitHub Desktop.

Select an option

Save rahulsom/7651053 to your computer and use it in GitHub Desktop.
CDA Anonymizer
import groovy.xml.XmlUtil
import java.security.SecureRandom
import java.text.SimpleDateFormat
void anonymize(Reader reader, Writer writer) {
def xml = new XmlParser().parse(reader)
xml.recordTarget.patientRole.with { patientRole ->
patientRole.id.each {
it.@extension = (it.@extension.hashCode()) % 1000
}
patientRole.addr.streetAddressLine.each {
if (it.value()) {
it.value = '123 Main St'
}
}
patientRole.telecom.each {
it.@value = '877-KAR-S4KI'
}
patientRole.patient.with {patient ->
def gender = patient.administrativeGenderCode.@code.find()
if (gender == 'F') {
patient.name.given.find().value = 'Jane'
} else if (gender == 'M') {
patient.name.given.find().value = 'John'
} else {
patient.name.given.find().value = 'Leslie'
}
patient.name.family.find().value = 'Smith'
def dobString = patient.birthTime.@value.find()
def dob = new SimpleDateFormat('yyyyMMdd').parse(dobString)
def age = new Date() - dob
def errorSign = new SecureRandom().nextBoolean() ? 1 : -1
def errorFloat = Math.pow(1.04, Math.pow(age, 0.50))
def error = new SecureRandom().nextInt(errorFloat.intValue()) * errorSign
def newDob = (dob + error).format('yyyyMMdd')
patient.birthTime.find().@value = newDob
}
}
XmlUtil.serialize(xml,writer)
}
def reader = new File('test.xml').newReader('UTF-8')
def writer = new File('test2.xml').newWriter('UTF-8')
anonymize(reader,writer)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment