2015-02-15 2 views
1

У меня есть список, который я хочу разделить и вставить в таблицу. Список содержит спаренные имена и значение:Сотовый список с разными разделителями

R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000 

Как я могу цикл по этому списку и вставить имена и значение в таблицу базы данных, как я борюсь, чтобы получить в моей голове использования различных разделителей и связанных с ними значений ,

Большое спасибо JC

+2

Как насчет 'ListToArray (myVar," ~~ ")'? –

+1

Вы также можете использовать cfloop с разделителем, чтобы перебрать ваш список. –

ответ

4

теги ColdFusion в & функция не в полной мере иметь дело с несколькими символами разделителями очень хорошо. ArrayToList() поддерживает несколько разделителей, но большинство других функций, связанных с списком, не работают.

Если ваши данные никогда не содержат ~ или ^, я бы воспользовался этим и заменил ограничители длиной 2 длины односторонними делителями.

(Edit: Как отмечает Leigh в комментариях, ReReplace, или ReplaceList() не требуется в этом случае, поскольку CF игнорирует пустые элементы по умолчанию). Он не изменит вывод, чтобы удалить его, но в этом и смысл, что он тоже ничего не делает. Отмечено, чтобы уточнить суть вопроса.)

<cfset dList = "R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000" /> 
<!---cfset dList = ReReplace(dList,"(~|\^)\1","\1","ALL")---> 
<cfset dArray = ListToArray(dList,"~",false) /> 
<cfloop array="#dArray#" index="a1"> 
    <cfquery...> 
    insert into mytable(lname,lvalue) 
    values(<cfqueryparam value="#listfirst(a1,"^")#">,<cfqueryparam value="#listlast(a1,"^^")#">) 
    </cfquery> 
</cfloop> 

Приятная часть об этом заключается в том, что она имеет неплохую обратную совместимость.

Однако это предполагает, что каждый элемент в списке с разделителями имеет два подпозиции. Если это не так и есть только полевая метка, вы можете это сделать.

<cfset dList = "R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000" /> 
<!---cfset dList = ReReplace(dList,"(~|\^)\1","\1","ALL")---> 
<cfset dArray = ListToArray(dList,"~",false) /> 
<cfloop array="#dArray#" index="a1"> 
    <cfquery...> 
    insert into mytable(lname,lvalue) 
    values(<cfqueryparam value="#listfirst(a1,"^")#">,<cfqueryparam value="#(listlen(a1,"^") gt 1 ? listlast(a1,"^") : "")#">) 
    </cfquery> 
</cfloop> 

Наконец, как Дэвид Фабер указывает в комментариях, вы можете использовать ReplaceList(dlist, "~~,^^", "~,^") вместо ReReplace(dList,"(~|\^){2}","\1","ALL"), который позволит достичь той же цели, но имеет дополнительное преимущество, заключающееся легче читать для людей, которые не могут быть комфортно с регулярными Выражения.

+1

Единственное, что я могу сделать по-другому, это использовать 'replaceList()' вместо 'ReReplace()': 'replaceList (dlist," ~~, ^^ "," ~,^")' –

+0

Для людей, неудобных с регулярным выражением особенно, это отличная идея! @DavidFaber –

+0

Большое спасибо за этот отличный ответ @cfqueryparam. Отличная деталь в вашем ответе, которая очень помогла мне. –

1

Я бы несколько иной подход (по причинам, изложенным в моих комментариях ... что если символ последовательности ~^ или ^~ существуют в данных, или даже одиночные символы ^ или ~?) И включить в список в JSON, а затем десериализации его в структуры:

<cfset the_list = "R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000" /> 

<!--- Escape characters that need to be escaped ---> 
<cfset the_list = replace(the_list, "\", "\\", "all") /> 
<cfset the_list = replace(the_list, """", "\""", "all") /> 

<cfset the_list = replace(the_list, "^^", """:""", "all") /> 
<cfset the_list = "{""" & replace(the_list, "~~", """,""", "all") & """}" /> 

<cfset the_coll = deserializeJSON(the_list) /> 

Единственная трудность, с вышесказанным бы, если бы были дубликаты ключей. В этом случае можно было бы использовать массив структур - это может быть достигнуто лишь за счет изменения линии, заменяющей двойной тильды ~~:

<cfset the_list = "[{""" & replace(the_list, "~~", """},{""", "all") & """}]" /> 

Затем цикл по массиву для вставки в базу данных.

Смежные вопросы