2015-09-23 3 views
1

Я просто смущаюсь с этим. У меня есть журнал данных, который сохраняется в базе данных, как-то вроде этого:Сплит и сортировка массива по дате, получение пустых массивов

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

+0

Имеются ли данные из верхней части вашей записи одной записи? Кроме того, каков ваш механизм базы данных. –

+0

Да, к сожалению, журнал сохраняется как одна запись. Я использую SQL Server – bWF800

+0

Тогда вы сможете решить его с помощью sql. Предложение 'where' может фильтровать только у выписанных пациентов. Функции 'patindex' и' mid' могут помочь вам получить ваши данные в предложении 'select'. Это то, как я буду заниматься этим. –

ответ

1

Выглядит, как вы боретесь с регулярным выражением двигателя Jakarta ORO который используется в ColdFusion. 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> 
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. У вас могут быть некоторые осложнения по целому ряду причин, но общая идея должна работать.

Смежные вопросы