OpenClinica 用户手册/导入数据
外观
有时将数据导入 OpenClinica 很有用。数据可以被修正,添加差异说明,并在导入时被检查,并且可以使用规则进行引用。
- 有时,将非 OpenClinica 数据视为单独的数据流,在研究结束时与 OpenClinica 的数据合并(尤其是当它不需要在 OpenClinica 界面中修改时)会更省事。
- 有时手动输入数据比导入数据更快
- 根据你的监管制度,你可能需要在导入数据之前验证对数据的任何操作
- 根据导入方法的不同,数据会以“已完成”状态进入系统,但数据管理员用户仍然可以将相同的数据上传到现有数据的顶部。将记录更改为“锁定”并不能阻止数据被覆盖。可能需要复杂的逻辑来避免覆盖
- 导入要求你在导入文件之前设置好受试者和预定访问
- 导入使用 CDISC ODM XML 文件,这些文件可能难以从 Excel、CSV 或你拥有的任何来源创建
- 创建 CDISC ODM XML 时需要获取事件和 CRF 的 OID
- 导入依赖于受试者的 SubjectKey(StudySubjectOID),它与他们的标准研究受试者 ID 不同,但以一致的方式变化。但是,如果他们的研究受试者 ID 发生了变化,那么 SubjectKey 将依赖于他们最初不正确的研究受试者 ID。因此,你可能需要为 ID 输入错误的受试者进行一些映射
OpenClinica.com 有关于如何导入 CDISC ODM 格式 XML 文件的文档。
该OpenClinica 维基 包含多个可用于导入数据的导入工具
从 CSV 文件(Microsoft Excel 可以保存为这种格式)生成 CDISC ODM XML 的一种方法是使用 XSLT 解析器,例如 Kernow,使用定制的 XSLT 转换来解析 CSV。
一个示例 CSV 文件(带有 SubjectKeys: SS_S001 和 SS_S002,ITEM_NAMES: I_APFIN_LBISOPROSTANES 和 I_APFIN_LBOXLDL)
,I_APFIN_LBISOPROSTANES,I_APFIN_LBOXLDL
SS_S001,10,20
SS_S002,30,40
用于导入的 XSLT 转换
<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:fn="fn"
exclude-result-prefixes="xs fn">
<xsl:output indent="yes" encoding="UTF-8"/>
<!-- update this with the path to your csv file -->
<xsl:param name="pathToCSV" select="'file:///C:/Test/FinalBlood.csv'"/>
<xsl:function name="fn:getTokens" as="xs:string+">
<xsl:param name="str" as="xs:string"/>
<xsl:analyze-string select="concat($str, ',')" regex='(("[^"]*")+|[^,]*),'>
<xsl:matching-substring>
<xsl:sequence select='replace(regex-group(1), "^""|""$|("")""", "$1")'/>
</xsl:matching-substring>
</xsl:analyze-string>
</xsl:function>
<xsl:template match="/" name="main">
<xsl:choose>
<xsl:when test="unparsed-text-available($pathToCSV)">
<xsl:variable name="csv" select="unparsed-text($pathToCSV)"/>
<!--UNIX line endings are 
 Windows are 
-->
<xsl:variable name="lines" select="tokenize($csv, '
')" as="xs:string+"/>
<xsl:variable name="elemNames" select="fn:getTokens($lines[1])" as="xs:string+"/>
<ODM xmlns="http://www.cdisc.org/ns/odm/v1.3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.cdisc.org/ns/odm/v1.3 ODM1-3.xsd" ODMVersion="1.3" FileOID="1D20080412202420" FileType="Snapshot" Description="First dataset for testing of ODM" CreationDateTime="2008-04-12T20:24:20" >
<!-- update this with your StudyOID -->
<ClinicalData StudyOID="S_2009CV16" MetaDataVersionOID="v1.0.0">
<xsl:for-each select="$lines[position() > 1]">
<xsl:variable name="lineItems" select="fn:getTokens(.)" as="xs:string+"/>
<xsl:if test="$lineItems[1] != string()">
<SubjectData><xsl:attribute name="SubjectKey"><xsl:value-of select="$lineItems[1]"/></xsl:attribute>
<!-- update these OIDs with your StudyEventOID, FormOID (a specific version) and ItemGroupOID-->
<StudyEventData StudyEventOID="SE_APFINALBLOODS" >
<FormData FormOID="F_APFINALBLOOD_V01">
<ItemGroupData ItemGroupOID="IG_APFIN_UNGROUPED" TransactionType="Insert" >
<xsl:for-each select="$elemNames[position() > 1]">
<xsl:variable name="pos" select="position()"/>
<ItemData><xsl:attribute name="ItemOID"><xsl:value-of select="$elemNames[$pos+1]"/></xsl:attribute><xsl:attribute name="Value"><xsl:value-of select="$lineItems[$pos+1]"/></xsl:attribute></ItemData>
</xsl:for-each>
</ItemGroupData>
</FormData>
</StudyEventData>
</SubjectData>
</xsl:if>
</xsl:for-each>
</ClinicalData>
</ODM>
</xsl:when>
<xsl:otherwise>
<xsl:text>Cannot locate : </xsl:text>
<xsl:value-of select="$pathToCSV"/>
</xsl:otherwise>
</xsl:choose>
</xsl:template>
</xsl:stylesheet>
这将创建以下 CDISC ODM XML 文件
<?xml version="1.0" encoding="UTF-8"?>
<ODM xmlns="http://www.cdisc.org/ns/odm/v1.3"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.cdisc.org/ns/odm/v1.3 ODM1-3.xsd"
ODMVersion="1.3"
FileOID="1D20080412202420"
FileType="Snapshot"
Description="First dataset for testing of ODM"
CreationDateTime="2008-04-12T20:24:20">
<ClinicalData StudyOID="S_2009CV16" MetaDataVersionOID="v1.0.0">
<SubjectData SubjectKey="SS_S001">
<StudyEventData StudyEventOID="SE_APFINALBLOODS">
<FormData FormOID="F_APFINALBLOOD_V01">
<ItemGroupData ItemGroupOID="IG_APFIN_UNGROUPED" TransactionType="Insert">
<ItemData ItemOID="I_APFIN_LBISOPROSTANES" Value="40"/>
<ItemData ItemOID="I_APFIN_LBOXLDL" Value="30"/>
</ItemGroupData>
</FormData>
</StudyEventData>
</SubjectData>
<SubjectData SubjectKey="SS_S002">
<StudyEventData StudyEventOID="SE_APFINALBLOODS">
<FormData FormOID="F_APFINALBLOOD_V01">
<ItemGroupData ItemGroupOID="IG_APFIN_UNGROUPED" TransactionType="Insert">
<ItemData ItemOID="I_APFIN_LBISOPROSTANES" Value="20"/>
<ItemData ItemOID="I_APFIN_LBOXLDL" Value="10"/>
</ItemGroupData>
</FormData>
</StudyEventData>
</SubjectData>
</ClinicalData>
</ODM>
然后根据 OpenClinica 的导入数据文档导入文件。
- 转换到 XML 的步骤仅在数据中没有换行符(因此没有多行文本字段)时才能正常工作。
- 输入中的 XML 字符(如 < 和 >)会导致问题。
- 更改模板或使用不同的转换工具(例如 http://servingxml.sourceforge.net/)可能可以避免这些问题。
- 如果所有数据都属于同一 CRF 中的同一事件,则 XML 最容易构建
- 需要重新组织数据,以使列标题具有正确的字段名称,并且每行中的第一项具有受试者名称