I'm customizing a CSV uploader to allow for column mapping. I've got a function that parses it into an Array, then I'm looping through it to generate select boxes with the uploaded file column names to map to existing column names in the corresponding table in my DB.
I can get the select drop downs to populate with the column names, but I can't figure out how to loop through the amount of columns in the uploaded file to limit the total amount of select dropdowns.
Function after it's parsed:
<!--- Get Value from Array based on Column Name --->
<cffunction name="ValByColName" access="public" returntype="string" output="false">
<cfargument name="ColName"type="string" required="true" default=""/>
<cfargument name="DataArray" type="array" required="true" default=""/>
<cfset findValue = keyArray.indexOf(#ColName#) + 1>
<cfreturn(#DataArray[findValue]#) />
</cffunction>
LOOP:
<!--- Set Uploaded file to Array --->
<cfset arrCSV = CSVToArray(CSVFilePath = #form.UploadedFile#,Delimiter = ",",Qualifier = """") />
<!--- Create Key array from column names --->
<cfset keyArray = ArrayNew(1)>
<cfloop from="1" to="#DON'T KNOW WHAT TO PUT HERE" index="t">
<!--- Variable Headers --->
<cfif Len(form.UploadedFile) GTE 5>
<cftry>
<select name="HeaderID" class="search" id="Header">
<option selected value="">--- Headers Uploaded ---</option>
<cfoutput>
<cfloop from="1" to="1" index="i">
<cfloop from="1" to="#ArrayLen(arrCSV[i])#" index="j">
<option name="HeaderID" value="#j#">#arrCSV[i][j]#</option>
</cfloop>
</cfloop>
</cfoutput>
</select> =
</cftry>
</cfif>
<cfquery name="clientsCols" datasource="#request.dsn#">
select Column_name
from Information_schema.columns
where Table_name like 'Clients'
</cfquery>
<!--- Constants--->
<cfif Len(form.UploadedFile) GTE 5>
<cftry>
<select name="ColumnID" class="search" id="Column">
<option selected value="">--- Headers Clients ---</option>
<cfoutput>
<cfloop query="clientsCols">
<option name="ColumnID" value="#Column_name#">#Column_name#</option>
</cfloop>
</cfoutput>
</select><br /><br />
</cftry>
</cfif>
</cfloop>
arrayLento get the total number of columns. That said .. your loop code looks more bulky/complex than is necessary. What is an example of your array data/headers and what should the form should look like?cfhttpis an option (though it can sometimes be a little picky about what it will parse). But the question of creating a simple column mapper still stands. Whichever method is used to parse the csv, the form code should be simpler than the loop above ..keyArray.indexOf( ColName ).. As an side be very careful using undocumented methods likeindexOf. Unlike most CF functions,indexOfis both case and data type sensitive. So unless you fully understand the nuances, it can lead to some unexpected results .. For CF9+, I would recommend usingArrayFind/FindNoCaseinstead.