2016-05-19 16 views
0

Ich arbeite an einem Projekt, wo ich Werte aus der Datenbank lesen und sie mit Werten aus CSV-Datei vergleichen muss. Nachdem ich meine cfquery ausgeführt habe, bekomme ich ungefähr 14k Datensätze zurück. Meine .csv-Datei hat ungefähr die gleiche Anzahl an Datensätzen. Ich suche nach der besten und effizientesten Möglichkeit, diese Datensätze zu vergleichen und sie in einer Struktur/einem Array zu speichern, die ich später verwenden kann, um Datensätze zu aktualisieren, die unterschiedlich sind. Ich verwende SQL für die Aktualisierung dieser Datensätze. Eine Anmerkung, bevor ich Ihnen mein Beispiel gezeigt habe, kann ich keine temporäre Tabelle in diesem Projekt verwenden, was alles komplexer macht. Hier ist mein Beispiel dafür, wie ich die Werte von DB ziehen und vergleichen sie mit Datensätzen aus CSV-Datei:Die beste Methode, um Werte aus DB- und CSV-Dateien zu vergleichen?

<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> 

Hier meine CSV-Datei Array umgewandelt wird:

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

In diesem Teil I gebrauchte Schleifen Aufzeichnungen vergleichen:

//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)> 

Zuerst habe ich einige Dinge erklären will, ich meine Arrays Listen umgewandelt, weil ich, dass wird die beste Art und Weise in meinen Update-Anweisungen später zu verwenden, dachte aber, nachdem ich p Einige Gedanken, die ich weiß, dass ich Liste in WHERE-Klausel verwenden kann, aber ich kann nicht in UPDATE SET verwenden. Was wäre der beste Weg, um diese Aufzeichnungen zu aktualisieren. Zweitens habe ich Schleifen darüber verschachtelt, die 14k Datensätze für jede Datensatzgruppe durchlaufen, die nicht empfohlen und effizient ist. Was wäre ein anderer Ansatz, dies zu tun und Datensätze zu vergleichen? Wenn jemand mit diesem Problem helfen kann, lass es mich wissen. Vielen Dank.

+0

Haben Sie nicht bereits [die gleiche Frage hier] (http://stackoverflow.com/questions/37300954/how-to-compare-values-from-struct-and-array-in-coldfusion)? – Leigh

+0

Ich fragte einen der Teile dieser Frage. –

+1

Ehrlich gesagt, der * beste * Weg, um diese Art von Aufgabe mit der Datenbank durchzuführen. Warum dürfen Sie keine temporären Tabellen (die * temporär * sind) verwenden? Es ist ein bisschen wie der alte Ausdruck "jemanden anstellen, um ein Haus zu bauen, aber sag ihnen, dass sie keine Nägel benutzen können". Sie sollten der PTB erklären, dass das Auferlegen dieser Art von Beschränkungen zu einem verschachtelten Code führt, der nicht gut funktioniert. Vor allem, wenn das Volumen wächst. Nur meine $ 0.02 .. – Leigh

Antwort

1

Ich kann nur empfehlen, Ihre Listen vor Schleifen zu sortieren. und setzen Sie lieber die innere Schleife als den Anfang von Anfang fort.