使用Coldfusion中的列名将CSV插入数据库
我已经看到了很多使用列的顺序/位置将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)#">
<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中的顺序。