寻找ICD-9代码的资源

时间:2009-10-05 13:59:50

标签: medical

客户已要求我们将ICD-9代码合并到系统中。

我正在寻找一个很好的资源来获得最终将在SQL数据库中的代码和描述的完整列表。

不幸的是,网络服务是不可能的,因为相当多的时间人员将使用该应用程序离线。

我找到了http://icd9cm.chrisendres.com/http://www.icd9data.com/,但都没有提供我能找到的数据的下载/导出。

我还发现http://www.cms.hhs.gov/MinimumDataSets20/07_RAVENSoftware.asp有一个ICD-9代码数据库,但它们格式不正确,我不能100%确定如何正确转换(它显示代码5566,这是真的556.6但我找不到关于如何/何时将代码转换为包含小数的规则

我用医疗和数据标记这个,因为我不是100%确定应该在哪里真正标记...任何帮助也会受到赞赏。

6 个答案:

答案 0 :(得分:11)

想要了解如何更正代码小数位。首先,需要考虑四个要点:

  1. 标准代码具有小数位XXX.XX
  2. 某些代码没有尾随小数位数
  3. V代码也遵循XXX.XX格式 - > V54.31
  4. E代码遵循XXXX.X - > E850.9
  5. 因此,如何解决错误的一般逻辑是

    If first character = E:
        If 5th character = '':
            Ignore
        Else replace XXXXX with XXXX.X                
    Else If 4th-5th Char is not '':                      (XXXX or XXXXX)
        replace XXXXX with XXX + . + remainder           (XXX.XX or XXX.X)
    (All remaining are XXX)
    

    我用两个SQL Update语句实现了这个:
    第1号,非电子代码:

    USE MainDb;
    UPDATE "dbo"."icd9cm_diagnosis_codes" 
        SET "DIAGNOSIS CODE" = SUBSTRING("DIAGNOSIS CODE",1,3)+'.'+SUBSTRING("DIAGNOSIS CODE",4,5)
    FROM "dbo"."icd9cm_diagnosis_codes"
    WHERE 
        SUBSTRING("DIAGNOSIS CODE",4,5) != ''
        AND
        LEFT("DIAGNOSIS CODE",1) != 'E'
    

    2号 - 对于E代码:

    UPDATE "dbo"."icd9cm_diagnosis_codes" 
        SET "DIAGNOSIS CODE" = SUBSTRING("DIAGNOSIS CODE",1,4)+'.'+SUBSTRING("DIAGNOSIS CODE",5,5)
    FROM "dbo"."icd9_Diagnosis_table"
    WHERE
        LEFT("DIAGNOSIS CODE",1) = 'E'
        AND
        SUBSTRING("DIAGNOSIS CODE",5,5) != ''
    

    似乎为我做了这个技巧(使用SQL Server 2008)。

答案 1 :(得分:9)

我前一段时间遇到了同样的问题,最终从头开始构建我自己的解决方案。最近,我提供了一个开放的API,供其他人使用的代码:http://aqua.io/codes/icd9/documentation

您只需下载JSON中的所有代码(http://api.aqua.io/codes/beta/icd9.json)或提取单个代码(http://api.aqua.io/codes/beta/icd9/250-1.json)。拉一个代码不仅可以为您提供ICD-10“人行横道”(等效),还可以提供一些额外的好处,例如相关的维基百科链接。

答案 2 :(得分:4)

我终于找到了以下内容:

“ICD-9-CM主要诊断代码和其他诊断代码的字段长度为6个字符,除V代码外的所有诊断代码的第3位和第4位之间都有小数点。小数表示为V代码在第二和第三位之间。“

因此,我能够获得完整的ICD-9列表,并根据需要重新格式化。

答案 3 :(得分:3)

您可能会发现ICD-9代码遵循以下格式:

  • 所有代码均为6个字符
  • 小数点位于第3个和第4个字符之间
  • 如果代码以V字符开头,则小数点位于第2个和第3个字符之间

检查出来:http://en.wikipedia.org/wiki/List_of_ICD-9_codes

答案 4 :(得分:3)

我自己也在这个问题上挣扎了很长时间。我能找到的最好的资源是这里的zip文件:

https://www.cms.gov/ICD9ProviderDiagnosticCodes/06_codes.asp

这很不幸,因为他们(奇怪地)缺少小数位,但正如其他几个海报所指出的那样,添加它们相当容易,因为规则是已知的。我能够在文本编辑器中使用基于“查找和替换”的正则表达式来添加它们。如果你走这条路线,要注意的一件事是你最终会得到一个尾随“。”的代码。但之后没有归零。这是无效的,所以你可能需要通过另一个查找/替换来清理它们。

上面链接中关于数据文件的令人讨厌的事情是与类别没有关系。根据您的应用程序,您可能需要哪些。我最终选择了一个我在网上找到的基于RTF的类别文件,并重新格式化它以获得每个类别的范围。在具有一些创造性正则表达式的文本编辑器中,这仍然是可行的。

答案 5 :(得分:1)

我能够在这里使用有用的答案,创建一个groovy脚本来对代码进行十进制化,并将长短描述组合成一个制表符分隔列表。如果这有助于任何人,我在这里包括我的代码:

import org.apache.log4j.BasicConfigurator
import org.apache.log4j.Level
import org.apache.log4j.Logger

import java.util.regex.Matcher
import java.util.regex.Pattern

Logger log = Logger.getRootLogger()
BasicConfigurator.configure();
Logger.getRootLogger().setLevel(Level.INFO);

Map shortDescMap = [:]
new File('CMS31_DESC_SHORT_DX.txt').eachLine {String l ->
    int split = l.indexOf(' ')
    String code = l[0..split].trim()
    String desc = l[split+1..-1].trim()
    shortDescMap.put(code, desc)
}
int shortLenCheck = 40      // arbitrary lengths, but provide some sanity checking...
int longLenCheck = 300
File longDescFile = new File('CMS31_DESC_LONG_DX.txt')
Map cmsRows = [:]
Pattern p = Pattern.compile(/^(\w*)\s+(.*)$/)
new File('parsedICD9.csv').withWriter { out ->
    out.write('ICD9 Code\tShort Description\tLong Description\n')
    longDescFile.eachLine {String row ->
        Matcher m = row =~ p
        if (m.matches()) {
            String code = m.group(1)
            String shortDescription = shortDescMap.get(code)
            String longDescription = m.group(2)
            if(shortDescription.size() > shortLenCheck){
                log.info("Not short? $shortDescription")
            }
            if(longDescription.size() > longLenCheck){
                log.info("${longDescription.size()} == Too long? $longDescription")
            }
            log.debug("Match 1:${code} -- 2:${longDescription} -- orig:$row")

            if (code.startsWith('V')) {
                if (code.size() > 3) {
                    code = code[0..2] + '.' + code[3..-1]
                }
                log.info("Code: $code")

            } else if (code.startsWith('E')) {
                if (code.size() > 4) {
                    code = code[0..3] + '.' + code[4..-1]
                }
                log.info("Code: $code")
            } else if (code.size() > 3) {
                code = code[0..2] + '.' + code[3..-1]
            }
            if (code) {
                cmsRows.put(code, ['longDesc': longDescription])
            }
            out.write("$code\t$shortDescription\t$longDescription\n")
        } else {
            log.warn "No match for row: $row"
        }
    }
}

我希望这有助于某人。

肖恩