11

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

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

不幸的是,Web 服务是不可能的,因为人们将在相当长的时间内离线使用该应用程序。

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

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

我用医疗和数据来标记它,因为我不能 100% 确定它应该在哪里真正标记......那里的任何帮助也将不胜感激。

4

6 回答 6

11

只是想插话如何更正代码小数位。首先,有四个要点需要考虑:

  1. 标准代码有小数位 XXX.XX
  2. 某些代码没有尾随小数位
  3. V 代码也遵循 XXX.XX 格式 --> V54.31
  4. E 代码遵循 XXXX.X --> E850.9

因此,如何修复错误的一般逻辑是

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 更新语句实现了这一点:
数字 1,用于非 E 代码:

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)。

于 2011-07-14T20:13:59.630 回答
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“人行横道”(等效项),还可以提供一些额外的好处,例如相关的 Wikipedia 链接。

于 2013-02-27T14:44:02.753 回答
4

我终于找到了以下内容:

“ICD-9-CM 主要和其他诊断代码的字段长度为六个字符,除 V 代码外,所有诊断代码的第三和第四位之间隐含小数点。V 代码之间隐含小数点第二个和第三个数字。”

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

于 2009-10-07T15:43:30.920 回答
3

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

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

看看这个:http ://en.wikipedia.org/wiki/List_of_ICD-9_codes

于 2009-10-20T18:57:12.277 回答
3

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

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

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

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

于 2011-06-14T15:01:06.530 回答
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"
        }
    }
}

我希望这可以帮助别人。

肖恩

于 2014-09-15T03:00:53.190 回答