【问题标题】:CSV to multidimensional array with ColdFusion使用 ColdFusion 将 CSV 转换为多维数组
【发布时间】:2011-07-11 12:48:20
【问题描述】:

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

coldfusion.runtime.Struct 类型的标量值不能分配给二维 ColdFusion 数组。 ColdFusion 二维数组只能保存一维 ColdFusion 数组和 Java List 对象。

我的 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 自定义标签的信息(标签 &lt;cf_php&gt; 对我来说是完美的)但管理员说不,因此我必须使用 ColdFusion 或找到某种方法通过 ColdFusion 呈现 PHP。框架、JavaScript 或 &lt;cfhttp&gt; 标记都是我认为可能有用的东西......如果你有想法,请告诉我。

【问题讨论】:

  • 如果你能解释一下你现有的 PHP 脚本在加载 CSV 数组后做了什么,我们可能会告诉你是否可以从 CF 调用你的 PHP 脚本。
  • @Anthony PHP 脚本从 CSV 文件中获取信息并以某种方式(基于 URL 中传递的变量)对其进行排序,然后将其输出到 HTML 表。 @Henry &lt;cf_php&gt; 似乎是个好主意,如果我的服务器支持自定义标签,但事实并非如此。不然我为什么要忘记&lt;cf_php&gt;>

标签: php arrays coldfusion csv multidimensional-array


【解决方案1】:

实际上,我认为您可以使用一维数组和 arrayAppend 进一步简化 Henry 的示例。

<cfset array=ArrayNew(1)>
<cfloop index="line" list="#csvfile#" delimiters="#chr(10)##chr(13)#">
    <cfset arrayAppend(array, listToArray(line))>
</cfloop>

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

仅供参考:原始代码是混合循环类型。对于&lt;cfloop list=".."&gt;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, ',')#>

【讨论】:

  • 谢谢。不完全是单线,但很接近;-)
  • @Leigh @Henry 你的两个答案都很好,非常感谢。我看到滥用index 是我的错误,但我想确保我正确理解您的答案。您答案的第三行是将当前行的所有元素复制到数组中,并且由于 listToArray 的默认分隔符是逗号,因此读取了两个元素而不是一个。该过程重复直到到达列表的末尾。对吗?
  • @typoknig - 基本上是的。
  • @Leigh @Henry 在搞砸了这个之后,我发现你的两个解决方案都有一个不幸的副作用。如果 CSV 文件的元素包含逗号,那么事情就会变得一团糟:(你们还有其他想法吗?请记住,一旦这些数据通过 ColdFusion 或 JavaScript 加载到数组中,我需要对其进行排序.
  • @typoknig - 这将是任何语言的问题。显然,分隔符值永远不应该在数据本身中使用,因为它几乎无法识别。是否至少引用了这些值?
【解决方案2】:
<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>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-26
    • 2019-06-29
    • 2012-08-15
    相关资源
    最近更新 更多