跳转至内容

OpenClinica 用户手册/导入数据

来自维基教科书,开放世界中的开放书籍

导入数据

[编辑 | 编辑源代码]

有时将数据导入 OpenClinica 很有用。数据可以被修正,添加差异说明,并在导入时被检查,并且可以使用规则进行引用。

你不应该这么做的原因(主要是便利性)

[编辑 | 编辑源代码]
  1. 有时,将非 OpenClinica 数据视为单独的数据流,在研究结束时与 OpenClinica 的数据合并(尤其是当它不需要在 OpenClinica 界面中修改时)会更省事。
  2. 有时手动输入数据比导入数据更快
  3. 根据你的监管制度,你可能需要在导入数据之前验证对数据的任何操作
  4. 根据导入方法的不同,数据会以“已完成”状态进入系统,但数据管理员用户仍然可以将相同的数据上传到现有数据的顶部。将记录更改为“锁定”并不能阻止数据被覆盖。可能需要复杂的逻辑来避免覆盖

使用标准导入的困难

[编辑 | 编辑源代码]
  1. 导入要求你在导入文件之前设置好受试者和预定访问
  2. 导入使用 CDISC ODM XML 文件,这些文件可能难以从 Excel、CSV 或你拥有的任何来源创建
  3. 创建 CDISC ODM XML 时需要获取事件和 CRF 的 OID
  4. 导入依赖于受试者的 SubjectKey(StudySubjectOID),它与他们的标准研究受试者 ID 不同,但以一致的方式变化。但是,如果他们的研究受试者 ID 发生了变化,那么 SubjectKey 将依赖于他们最初不正确的研究受试者 ID。因此,你可能需要为 ID 输入错误的受试者进行一些映射

如何操作

[编辑 | 编辑源代码]

OpenClinica.com 有关于如何导入 CDISC ODM 格式 XML 文件的文档

OpenClinica 维基 包含多个可用于导入数据的导入工具

使用 XSLT 将 CSV 转换为 CDISC ODM XML

[编辑 | 编辑源代码]

从 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 &#xa; Windows are &#xd;&#xa;-->
        <xsl:variable name="lines" select="tokenize($csv, '&#xd;&#xa;')" 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 最容易构建
  • 需要重新组织数据,以使列标题具有正确的字段名称,并且每行中的第一项具有受试者名称
华夏公益教科书