使用 Coldfusion 中的列名将 CSV 插入数据库

问题描述

我已经看到很多使用列的顺序/位置将 csv 内容插入数据库的示例:

<cffile action="read" file="C:\foo\bar\test.csv" variable="csvfile">

<cfloop index="index" list="#csvfile#" delimiters="#chr(10)##chr(13)#"> 
    <cfquery name="importcsv" datasource="#systemDSN#"> 
         INSERT INTO csvdemo (test1,test2,test3,test4) 
         VALUES 
                  ('#listgetAt('#index#',1,',')#','#listgetAt('#index#',2,3,4)#' 
                  ) 
   </cfquery> 
</cfloop>

我似乎找不到按 csv 列名插入的示例。任何人都可以为我指明正确的方向,或者提供一个示例来说明如何做到这一点或您是如何做到的?

编辑:如果我的 csv 有以下列,而我只想要姓氏、用户名和 LastAccessed,并且列的顺序可以在 csv 上变化:

UserId UserName OrgDefinedId FirstName MiddleName LastName IsActive Organization ExternalEmail SignupDate FirstLoginDate Version OrgRoleId LastAccessed

解决方法

试试这个:

<!--- SET THE RECORD COUNT HERE ----->
<cfset end_of_line = Chr(10)>

<!--- PLACE CONTENT OF YOUR CSV FILE INTO A SINGLE VARIABLE ----->
<cffile action="READ"
file="C:\foo\bar\test.csv" variable="DataFile">

<!----- CLEAN AND TRIM DATA FILE ----->
<cfset clean_data_file = #trim(DataFile)#>

<!--- PUT THE LIST INTO AN ARRAY ----->
<cfset data_line_array = ListToArray(clean_data_file,end_of_line)>

<!--- COUNT THE NUMBER OF ARRAYS ----->
<cfset arraycount = #ArrayLen(data_line_array)#>

<!--- CREATE A 2-DIMENSIONAL ARRAY WHICH WILL HOLD ALL THE VALUES OF THE CSV ----->
<cfset recvalue = ArrayNew(2)>
<cfset recvaluectr = 1>

<cfloop index ="x" from="1" to="#arraycount#">
    <!--- DEFINE THE DELIMITER USED WHICH IS COMMA OR TAB ----->
    <cfset data_element_array = ListToArray(Data_Line_Array[x],',')>
    <cfset elementarraycount = #ArrayLen(Data_Element_Array)#>

    <!--- SET THE FIELDDATA (COLUMN) TO AN ELEMENT IN THE ARRAY ----->

    <!--- FIRST COLUMN ----->
    <cfset tmp_element_1 = '#data_element_array[1]#'>
    <cfset element_1 = '#trim(Replace(tmp_element_1,'"',' ','All'))#'>

    <!--- SECOND COLUMN and so on... ----->
    <cfset tmp_element_2 = '#data_element_array[2]#'>
    <cfset element_2 = '#trim(Replace(tmp_element_2,'All'))#'>
</cfloop>

<!---- THEN PUT EVERYTHING IN THE TABLE ----->
<cfloop index='i' from='1' to='#arraycount#'>
        <cfquery name="WriteToTable" datasource="MyDatabase" dbtype="odbc">
            insert into MyTable (
                column1,column2
                )
                values (
                '#trim(recvalue[i][1])#','#trim(recvalue[i][2])#'
                )
        </cfquery>
</cfloop>

让我知道这是否有效。谢谢。 :)