0

我正在做一个项目,我必须从数据库中读取值并将它们与 .csv 文件中的值进行比较。运行 cfquery 后,我得到了大约 14k 条记录。我的 .csv 文件的记录数大致相同。我正在寻找最好和最有效的方法来比较这些记录并将它们存储在一些结构/数组中,以便以后可以用来更新不同的记录。我正在使用 SQL 来更新这些记录。在我向您展示我的示例之前的一个注释,我无法在这个项目中使用临时表,这使一切变得更加复杂。这是我如何从数据库中提取值并将它们与 .csv 文件中的记录进行比较的示例:

<cfquery name="getRecords" datasource="Test">
    Select USER_NUMBER, STATUS
    From USERS
</cfquery>  

<cfset myStruct = StructNew()>

<cfloop query="getRecords">
    <cfset myStruct[USER_NUMBER] = {status=STATUS}>
</cfloop>

这是我转换为数组的 .csv 文件:

<cffile action="read" file="#MyCSV#" variable="CsvFile">
<cfset myarray = ListToArray(CsvFile, chr(13))>
<cfset cnt = ArrayLen(myarray)>

在这一部分中,我使用循环来比较记录:

//array that holds user numbers
<cfset userNum = arrayNew(1)>
//array that holds status code
<cfset statusCode = arrayNew(1)>

<cfloop collection="#myStruct#" item="j">
    <cfloop index="i" from="1" to=#(cnt)# step="1"> 
        <cfif len(trim(myarray[i])) GT 0>
            <cfset myrow = #replace(myarray[i],chr(10),'')#>
            <cfset myrow = ListToArray(myrow,",",true)>

            //compare if user numbers are the same
            <cfif #myrow[1]# EQ #j#>
                //compare if status code is different
                <cfif #myrow[23]# NEQ #myStruct[j].lunchst#>
                    //Store user number and status code that are different
                    //from csv file       
                    <cfset arrayAppend(userNum, "#myrow[1]#")>
                    <cfset arrayAppend(statusCode, "#myrow[23]#")>  
                </cfif> 
            </cfif> 
        </cfif>
    </cfloop>
</cfloop>

//Here I converted both arrays to list
<cfset listUserNum = ArrayToList(userNum)>
<cfset listStatus = ArrayToList(statusCode)>

首先我想解释几件事,我将我的数组转换为列表,因为我认为这将是稍后在我的 UPDATE 语句中使用的最佳方式,但是在我提出一些想法之后,我意识到我可以在 WHERE 子句中使用列表,但我可以不在 UPDATE SET 中使用。更新这些记录的最佳方法是什么。其次,我在上面有嵌套循环,每组记录都经过 14k 条记录,这是不推荐和高效的。执行此操作并比较记录的其他方法是什么?如果有人可以帮助解决这个问题,请告诉我。谢谢你。

4

1 回答 1

1

我只能建议在循环之前对列表进行排序。而是继续内部循环而不是从头开始。

于 2016-05-19T14:54:43.417 回答