2016-05-19 12 views
0

私はデータベースから値を読み取り、それらを.csvファイルの値と比較する必要があるプロジェクトに取り組んでいます。 cfqueryを実行した後、約14kレコードが返されます。私の.csvファイルには、ほぼ同じ数のレコードがあります。私は、これらのレコードを比較し、構造/配列に格納して、後で別のレコードを更新するために使用できる最も効率的な方法を探しています。これらのレコードの更新にはSQLを使用しています。私が私の事例を示す前に、このプロジェクトでは一時テーブルを使ってすべてをより複雑にすることはできません。ここで私はDBから値を引き出し、.CSVファイルからのレコードとそれらを比較する方法の私の例である: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)> 

まず私は後で私のpの後にそれが私のUPDATE文で使用するための最良の方法となります考えていたので、私はリストに私の配列を変換し、いくつかのことを説明したいです私はWHERE句でリストを使うことができることを認識していますが、UPDATE SETでは使用できません。これらのレコードを更新するにはどうすればよいでしょうか。 2番目は、推奨されていない効率的なレコードセットごとに14kレコードを超えるネストされたループがあります。これを行い、記録を比較する他のアプローチは何でしょうか?誰かがこの問題を助けることができるなら私に知らせてください。ありがとうございました。

+0

あなたはまだ[ここでこの同じ質問をしてください](http://stackoverflow.com/questions/37300954/how-to-compare-values-from-struct-and-array-in-coldfusion)していませんか? – Leigh

+0

私はこの質問の一部を尋ねました。 –

+1

正直なところ、データベースを使用してこの種のタスクを実行する*最良の方法です。なぜ一時テーブル(*は一時的なものです)を使用できないのですか?それは、「家を建てるのに誰かを雇うが、彼らには釘を使うことはできない」という古い表現のようなものです。この種の制限を課すことは、うまく機能しない複雑なコードになることをPTBに説明するべきです。特にボリュームが増えるにつれて。ちょうど私の$ 0.02 .. – Leigh

答えて

1

ループの前にあなたのリストを並べ替えることができます。 ではなく、beginから開始するよりも内側のループを継続します。

関連する問題