比较DB和CSV文件中值的最佳方法?

时间:2016-05-19 14:21:56

标签: arrays sql-server csv coldfusion cfloop

我正在处理项目,我必须从数据库中读取值并将它们与.csv文件中的值进行比较。运行我的cfquery之后,我得到大约14k条记录。我的.csv文件具有大约相同数量的记录。我正在寻找最佳和最有效的方法来比较这些记录并将它们存储在一些结构/数组中,以后我将能够用它来更新不同的记录。我使用SQL来更新这些记录。在我向您展示我的示例之前的一点说明,我在这个项目中无法使用临时表,这使得一切变得更加复杂。这是我如何从DB中提取值并将它们与.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子句中使用list但我不能在UPDATE SET中使用。更新这些记录的最佳方法是什么。其次,我有上面的嵌套循环,为每组记录提供14k记录,这些记录不推荐且效率很高。还有什么方法可以做到这一点并比较记录?如果有人可以帮助解决这个问题,请告诉我。谢谢。

1 个答案:

答案 0 :(得分:1)

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