CSV в многомерный массив с ColdFusion - PullRequest
3 голосов
/ 09 марта 2011

Я пытаюсь загрузить файл CSV в массив с помощью ColdFusion (версия 7.0.2.142559). Прямо сейчас я получаю следующую ошибку:

Скалярное значение типа coldfusion.runtime.Struct не может быть присвоено двумерному массиву ColdFusion. Двухмерный массив ColdFusion может содержать только одномерные массивы 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#>

Бонус:

С другой стороны, это сэкономило бы мне много времени, если бы был какой-то способ вызова PHP-файла из ColdFusion, поскольку у меня уже весь этот сценарий завершен (это лишь небольшая часть) на PHP. Я читал о пользовательских тегах ColdFusion (тег <cf_php> отлично подойдет для меня), но администратор говорит, что нет, поэтому я должен работать с ColdFusion или найти какой-нибудь способ визуализации PHP через ColdFusion. Фреймы, JavaScript или тег <cfhttp> - это все, что я думаю, что может работать ... если у вас есть идея, дайте мне знать.

Ответы [ 2 ]

5 голосов
/ 09 марта 2011

На самом деле, я думаю, вы могли бы еще больше упростить пример Генри, используя одномерный массив и arrayAppend.

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

Скалярное значение типа coldfusion.runtime.Struct нельзя назначен на 2-х мерный 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 голос
/ 09 марта 2011
<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>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...