0

データベースから値を読み取り、.csv ファイルの値と比較する必要があるプロジェクトに取り組んでいます。cfquery を実行すると、約 14,000 件のレコードが返されます。私の .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 ステートメントで使用するのに最適な方法だと思っていたからです。 UPDATE SET では使用しないでください。これらの記録を更新する最善の方法は何でしょうか。2 番目に、レコードのセットごとに 14,000 レコードを通過する上記のループをネストしましたが、これは推奨されておらず効率的ではありません。これを行い、レコードを比較する他のアプローチは何でしょうか? 誰かがこの問題を解決できる場合は、私に知らせてください。ありがとうございました。

4

1 に答える 1