使用ColdFusion将CSV转换为多维数组

3

我正在尝试使用ColdFusion(版本7.0.2.142559)将CSV文件加载到数组中。目前我遇到以下错误:

无法将coldfusion.runtime.Struct类型的标量值分配给二维ColdFusion数组。 ColdFusion 2维数组只能容纳1维ColdFusion数组和Java列表对象。

我的CSV文件按照以下格式设置:

a,b
c,d
e,f

这是我第一次使用ColdFusion,所以可能有一些简单的语法错误我无法看到。以下是代码:

<!--- get the current full path of the current --->
<cfset currentPath = getCurrentTemplatePath()>
<cfset currentDirectory = getDirectoryFromPath(currentPath)>
<!--- get and read the CSV-TXT file --->
<cffile action="read" file="#currentDirectory#/smalltest.csv" variable="csvfile">
<!--- create a new array --->
<cfset array=ArrayNew(2)>
<!--- loop through the CSV-TXT file on line breaks and insert into database --->
<cfloop index="index" list="#csvfile#" delimiters="#chr(10)##chr(13)#">

    <cfset array[#index#][1]=#listgetAt('#index#',1, ',')#>
    <cfset array[#index#][2]=#listgetAt('#index#',2, ',')#>

</cfloop>

<cfdump var=#array#>

奖励:

顺便说一下,如果有某种方式可以从ColdFusion中调用PHP文件,那将节省我很多时间,因为我已经在PHP中完成了整个脚本(这只是一个小部分)。我了解到ColdFusion自定义标签(标签<cf_php>非常适合我),但管理员表示不行,因此我必须使用ColdFusion或找到一些通过ColdFusion渲染PHP的方法。框架、JavaScript或<cfhttp>标签都是我认为可能有效的方法......如果您有任何想法,请告诉我。


如果您能解释一下加载CSV数组后,现有的PHP脚本是做什么的,我们可能会告诉您是否可能从CF调用您的PHP脚本。 - Antony
@Anthony 这个 PHP 脚本从 CSV 文件中获取信息并按特定方式排序(根据 URL 中传递的变量),然后将其输出到 HTML 表格中。 @Henry <cf_php> 看起来是个好主意,如果我的服务器支持自定义标签,但事实并非如此。我还有什么理由忘记 <cf_php> - ubiquibacon
2个回答

5
实际上,我认为您可以使用一维数组和arrayAppend更简单地简化亨利的示例。
<cfset array=ArrayNew(1)>
<cfloop index="line" list="#csvfile#" delimiters="#chr(10)##chr(13)#">
    <cfset arrayAppend(array, listToArray(line))>
</cfloop>

不能将coldfusion.runtime.Struct类型的标量值分配给二维ColdFusion数组。

提示:原始代码混合了循环类型。使用<cfloop list="..">时,index值是列表中的一个元素,例如"a,b"(不是行号)。显然,"a,b"不是预期的数值索引,因此会出现错误。

<!--- what the code is actually doing --->
<cfset array['a,b'][1]=#listgetAt('#index#',1, ',')#>
<cfset array['a,b'][2]=#listgetAt('#index#',2, ',')#>
<cfset array['c,d'][1]=#listgetAt('#index#',1, ',')#>
....

与您的错误无关,这些#符号都是不必要的。代码可以两种方式工作,但更干净的写法是:

<cfset array[lineNum][1]= listgetAt( index, 1, ',')>

替代

<cfset array['#lineNum#'][1]=#listgetAt('#index#',1, ',')#>

1
@Leigh @Henry,我再仔细研究了一下,发现你们两个的解决方案都有一个不幸的副作用。如果CSV文件的某个元素包含逗号,则会出现混乱:( 你们还有其他想法吗?请记住,一旦将数据加载到数组中,我需要通过ColdFusion或JavaScript对其进行排序。 - ubiquibacon
@typoknig - 你在使用什么PHP函数?listToArray()类似于PHP的explode()或Java的split()。它们是通用的,不是专门为CSV格式设计的(即嵌入逗号和引号)。尝试使用类似CSVtoArray cflib.org/udf/CSVtoArray的东西。 - Leigh
@Leigh 我正在使用 fgetcsv 并以逗号为分隔符。我认为 ColdFusion 不像 PHP 一样专门处理 CSV。因为 PHP 函数 fgetcsv 是专门用于 CSV 的,它足够聪明,知道不要在双引号之间的逗号处进行分隔。 - ubiquibacon
@typoknig - 是的,没有专门用于csv格式的函数。最接近fgetcsv的等效函数可能是cfhttp(虽然它返回一个查询)。对于数组,可以使用现有的udf之一,例如http://www.bennadel.com/index.cfm?dax=blog:976.view,或任何已建立的Java库。有很多这样的库。由于CF运行在Java上,您只需将jar文件放入类路径中即可开始使用。 - Leigh
@Leigh 我的问题是我对我们的服务器的访问非常有限,所以我无法实现简单的更改(比如将文件添加到类路径中),这会让我的生活变得更轻松。我们的信息服务部门处理所有与Web相关的事务,除了速度缓慢之外,他们不喜欢实施任何更改,因为现在一切都“正常”。无论如何,我终于找到了一种方法,在.cfm文件中使PHP工作。我只需在.cfm文件中调用PHP,并使PHP脚本回显所需的JavaScript,以创建一个<iFrame>。虽然有些混乱,但它确实起作用。 - ubiquibacon
显示剩余6条评论

1
<cfset array=ArrayNew(2)>
<cfset lineNum=1>
<cfloop index="line" list="#csvfile#" delimiters="#chr(10)##chr(13)#">
    <cfset array[lineNum] = listToArray(line)>
    <cfset lineNum = lineNum + 1>
</cfloop>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接