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

使用Coldfusion中的列名将CSV插入数据库,csv,coldfusion,Csv,Coldfusion,我已经看到了很多使用列的顺序/位置将csv内容插入数据库的示例: <cffile action="read" file="C:\foo\bar\test.csv" variable="csvfile"> <cfloop index="index" list="#csvfile#" delimiters="#chr(10)##chr(13)#">

我已经看到了很多使用列的顺序/位置将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, ',')#', 
                   '#listgetAt('#index#',3, ',')#', 
                   '#listgetAt('#index#',4)#' 
                  ) 
   </cfquery> 
</cfloop>

插入csvdemo(test1、test2、test3、test4)
价值观
(“#listgetAt”(“#index#”,1,”)#,
"#listgetAt(#index#,,
"#listgetAt(#index#,,
“#listgetAt(#index#,4)#”
) 
我似乎找不到按csv的列名插入的示例。任何人都可以为我指出正确的方向,或提供一个如何做或你如何做的例子

编辑:如果我的csv有以下列,并且我只想要LastName、UserName和LastAccessed,并且列的顺序可以在csv上改变:

UserId UserName OrgDefinedId FirstName MiddleName LastName IsActive Organization ExternalEmail SignupDate firstlogin数据版本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>


为什么不先将CSV转换为查询呢。这似乎是一个很好的转换方法,因为它允许解析CSV头:我还没有在发送给您的链接中测试该方法。如果它不起作用,我可以向您发送一个CSVToQuery方法,我创建了这个方法。我知道我的版本可以用。你可以用
而不是
来读取文件。如果您使用
name
属性,您会得到一个查询对象。@Dan Bracuk RE:cfhttp:这太好了。这项功能最先引入的是哪个版本的ACF/Lucee?我从ACF 4.5开始,它就在那里。它在#trim(recvalue[I][1])#处出错。在这个例子中,我仍然需要知道列的顺序。例如,我想获得“用户名”列,但不知道它在csv中的顺序。