我有一个列表,我想拆分并插入表中。该列表包含成对的名称和值:
R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000
我如何遍历此列表并将名称和值插入数据库表中,因为我正在努力使用不同的分隔符及其相关值。
非常感谢 JC
答案 0 :(得分:4)
ColdFusion的标签&函数不能完全处理多字符分隔符。 ArrayToList()
支持多个分隔符,但大多数其他与列表无关的函数不支持。
如果您的数据本身从不包含~
或^
,我会利用它并用一长度的分隔符替换2长度的分隔符。
(编辑:正如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>
最后,正如David Faber在评论中指出的那样,您可以使用ReplaceList(dlist, "~~,^^", "~,^")
而不是ReReplace(dList,"(~|\^){2}","\1","ALL")
来实现相同的目标,但又有一个额外的好处,那就是对于那些可能不会更容易阅读的人来说对正则表达式感到满意。
答案 1 :(得分:1)
我会采取稍微不同的方法(出于我的评论中所述的原因......如果数据中存在字符序列~^
或^~
,甚至单个字符{{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) />
的行来实现:
~~
然后遍历数组以插入数据库。