按日期拆分和排序数组,获取空白数组位置

时间:2015-09-23 19:25:33

标签: coldfusion

我只是在困惑这个。我有一个数据日志保存在数据库中,如下所示:

Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
Reason for Discharge:01 - (routine discharge). 
<!--- all other tracking info --->

我正试图从这个日志中提取排放并按日期排序/过滤它们。此日志作为一列varchar(MAX)保存在数据库中。我需要对这些数据进行排序,并且只使用正则表达式拉出放电日期/原因,然后应用过滤器。最终产品最终应该把我放在一个带PATIENT | DISCHARGE DATE | DISCHARGE REASON的表中。我的代码现在正在给我一些错误,因为它给我留下了一些空的数组值。我的问题是我需要删除那些空白值并按日期排序,但我不确定从哪里开始。

  <cfquery name="getDischarge" datasource="#this.dsn#">
    select PatientsName, LogData from Patient
  </cfquery>

  <cfoutput query="getDischarge" group="PatientsName">

            <cfif LogData neq "">

              <cfsavecontent variable="str">
              #LogData#
              </cfsavecontent>

              <cfset possibilities = reMatch("Discharge Date?:(\d\d?/\d\d?/\d{4})\s*Reason for Discharge:\d* - ((?:(?!Log-Date:).)*)", str)>

              <cfset dateArray = ArrayNew(2)>

                  <cfloop index="w" 
                          array="#possibilities#">

                    <cfif w NEQ "">

                      <!--- create 1 dimensional temp array to hold DATE | REASON --->
                      <cfset tempArray = ArrayNew(1)>
                      <!--- trim our regex to have only the date & then DateFormat --->
                      <cfset theDate = #Mid(w, 16, 11)#>
                      <cfset formatDate = #dateformat('#thedate#','mm-dd-yyyy')#>
                      <!--- use our regex to find the reason for discharge --->
                      <cfset theReason = reMatch("Reason for Discharge:\d* - ((?:(?!Log-Date:).)*)", str)>
                      <!--- append our DATE | REASON to 1d temp array --->
                      <cfset ArrayAppend(tempArray, '#formatDate#')>
                      <cfset ArrayAppend(tempArray, '#theReason#')>
                      <!--- append our 1d array to our 2d array to output matching DATE | REASON --->
                      <cfset #ArrayAppend(dateArray, '#tempArray#')#>

                    </cfif>

                  </cfloop>



              <cfdump var="#dateArray#"> 
           </cfif> <!--- logdata neq "" --->
</cfoutput> 

对我来说,逻辑上,这应该可以工作并省略空白值,但这是我在转储这些数据时得到的: enter image description here

2 个答案:

答案 0 :(得分:1)

看起来你正在努力使用ColdFusion中使用的Jakarta ORO正则表达式引擎。捕获时reMatch / reMatchNoCase非常糟糕。另一方面,Java提供了POSIX正则表达式引擎。

<cfset data = [
    "Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
    Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
    Reason for Discharge:01 - (routine discharge).
    More stuff...",
    "Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
    Log-Date: 06/20/2013 Discharged. Discharge Date:10/16/2012
    Reason for Discharge:lorem ipsum."
]>

<cfset result = queryNew("DISCHARGE_DATE,DISCHARGE_REASON", "VARCHAR,VARCHAR")>

<cfloop array="#data#" index="line">

    <cfset dischargeDate    = reMatchGroupNoCase("Discharge Date:([0-9]{2}/[0-9]{2}/[0-9]{4})", line)>
    <cfset dischargeReason  = reMatchGroupNoCase("Reason for Discharge:([^\n]*)", line)>

    <cfset hasDate    = (arrayLen(dischargeDate)   eq 1)>
    <cfset hasReason  = (arrayLen(dischargeReason) eq 1)>

    <cfif hasDate or hasReason>

        <cfset rowIndex = queryAddRow(result, 1)>

        <cfif hasDate and isDate(dischargeDate[1])>
            <cfset querySetCell(result, "DISCHARGE_DATE", dateFormat(dischargeDate[1], "yyyy-mm-dd"), rowIndex)>
        </cfif>
        <cfif hasReason>
            <cfset querySetCell(result, "DISCHARGE_REASON", dischargeReason[1], rowIndex)>
        </cfif>

    </cfif>

</cfloop>

<cfquery name="orderedResult" dbType="query">

    SELECT
        *

    FROM
        [result]

    ORDER BY
        [DISCHARGE_DATE] ASC

</cfquery>

<cfdump var="#orderedResult#">

这是你需要的功能:

<cffunction name="reMatchGroupNoCase" access="public" output="false" returnType="array">

    <cfargument name="regex"    type="string"   required="true">
    <cfargument name="value"    type="string"   required="true">

    <cfset LOCAL.result = []>

    <cfset LOCAL.Pattern    = createObject("java", "java.util.regex.Pattern")>
    <cfset ARGUMENTS.regex  = LOCAL.Pattern.compile(ARGUMENTS.regex, bitOr(LOCAL.Pattern["CASE_INSENSITIVE"], LOCAL.Pattern["UNICODE_CASE"]))>

    <cfset LOCAL.buffer = ARGUMENTS.regex.matcher(toString(ARGUMENTS.value))>
    <cfset LOCAL.length = LOCAL.buffer.groupCount()>

    <cfloop condition="LOCAL.buffer.find()">

        <cfloop from="1" to="#LOCAL.length#" index="LOCAL.i">

            <cfset LOCAL.value = LOCAL.buffer.group(
                javaCast("int", LOCAL.i)
            )>

            <cfif isNull(LOCAL.value)>
                <cfcontinue>
            </cfif>

            <cfset LOCAL.result.add(LOCAL.value)>

        </cfloop>

    </cfloop>

    <cfreturn LOCAL.result>
</cffunction>

答案 1 :(得分:0)

我推荐这种方法:

with q1 as (select 'Log-Date: 10/26/2012. Record created. Admission Date: 08/01/2012
Log-Date: 06/20/2013 Discharged. Discharge Date:10/15/2012
Reason for Discharge:01 - (routine discharge). ' logData
)

select substring(logData, patindex('%Admission Date: %', logdata) + 16
, 10) admitDate
from q1
where logData like '%Discharge Date:%'

返回08/01/2012。由于各种原因,您可能会遇到一些并发症,但总体思路应该有效。