【问题标题】:Parsing CSV with coldfusion使用冷融合解析 CSV
【发布时间】:2016-08-29 12:29:41
【问题描述】:

我想创建一个新函数,它将获取 CSV 并从中解析数据,然后将其写入数据库。 到目前为止,我设法得到了这个:

<cfhttp method="get" url="C:\ColdFusion11\path\test.csv" name="csvData"> 
<cfoutput>#isQuery(csvData)#</cfoutput>

<cfloop query="csvdata" >
    <p>
<cfloop list="#csvdata.columnlist#" index="i">
    <cfoutput>
            #csvdata['#i#'][currentRow]# - 
    </cfoutput>    
</cfloop>
</p>
</cfloop>

我得到这个错误: 变量 CSVDATA 未定义
我不知道为什么会出现这个错误,因为我的 var 是在 cfhttp 中定义的(或者我在那里做错了什么?)

【问题讨论】:

  • ... url="C:\ColdFusion11\path\test.csv" 这不是有效的 url。正如标签名称所暗示的那样,cfhttp 用于发出 http 请求,而不是读取本地驱动器上的文件。
  • 其实用cfhttp读取服务器上的文件是完全有效的。要查看示例,请转到此处,help.adobe.com/en_US/ColdFusion/9.0/CFMLRef/…,然后查找以 Building a query from a delimited text file 开头的部分。正如你所指出的,url 的语法是不同的。
  • @DanBracuk - 是的,这不是我最清楚的措辞。我的意思是它需要一个 URL(即 http|https),而不是像“c:/path/file.ext”这样的本地文件路径。
  • @AdrianJ.Moreno 我发现 cfspreadsheet type="csv" 只是将读取的 xls 文档转换为 csv 格式。不确定这有多大用处。

标签: coldfusion coldfusion-11


【解决方案1】:

这段代码对我有用:

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

<cfquery name="rscsvdemo" datasource="#systemDSN#"> 
         SELECT * FROM csvdemo 
</cfquery> 
<cfdump var="#rscsvdemo#">

【讨论】:

  • 大多数数据库都提供了更有效地导入 csv 文件的工具,例如 BULK INSERT、LOAD DATA.. 为什么不使用 db 工具呢?顺便说一句,始终使用 cfqueryparam(尤其是在循环时)。
  • 为什么使用 cfqueryparam 更好?
  • *为什么使用 cfqueryparam 更好?
  • 在这种情况下,主要原因是提高性能(因为查询被执行多次)并保护您的数据库免受 sql 注入。尽管如此,使用 db 工具导入文件通常更快、更有效。
  • @T2Admin 但是 cfqueryparam 有一些限制。如果我们在 cfqueryparam 中传递列表值意味着 cfqueryparam 只允许 2100 个值进入列表。因此,我们列表中超过 2100 个值意味着 cfqueryparam 抛出错误。
【解决方案2】:

这是一个旧线程,但仍然有效。 cfml 中没有捆绑简单的 csv 工具,但有很多方法可以解析 csv, 一个简单的技巧是使用 cfhttp,但您需要能够通过 http(s) 加载它

 <cfhttp method="get" name="CSVQry"
    url="#siteAddress#/data/table.csv"
    firstRowAsHeaders="true"
    columns="#COLUMNLIST#"
    delimiter="#DELIMITER#">
 </cfhttp>

一个更通用的解决方案是 Ben Nadels csv 解析器,我非常推荐它。 https://www.bennadel.com/blog/483-parsing-csv-data-using-coldfusion.htm

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多