首页 > 解决方案 > 使用 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, ',')#', 
                   '#listgetAt('#index#',3, ',')#', 
                   '#listgetAt('#index#',4)#' 
                  ) 
   </cfquery> 
</cfloop>

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

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

UserId 用户名 OrgDefinedId FirstName MiddleName LastName IsActive 组织 ExternalEmail SignupDate FirstLoginDate Version OrgRoleId LastAccessed

标签: csvcoldfusion

解决方案


试试这个:

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

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


推荐阅读