具有不同分隔符的配对列表
Paired list with different delimiters
我有一个列表,我想将其拆分并插入到 table 中。该列表包含成对的名称和值:
R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000
我如何遍历此列表并将名称和值插入数据库table,因为我正在努力了解不同分隔符及其相关值的使用。
非常感谢
江城
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,"(~|\^)","","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,"(~|\^)","","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}","","ALL")
,这将实现相同的目标,但还有一个额外的好处,即更易于阅读的人可能对正则表达式不太满意。
我会采取稍微不同的方法(出于我评论中所述的原因......如果数据中存在字符序列 ~^
或 ^~
,甚至单个字符 ^
或 ~
?) 并将列表转换为 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") & """}]" />
然后遍历数组以插入数据库。
我有一个列表,我想将其拆分并插入到 table 中。该列表包含成对的名称和值:
R0006^^1.00000000~~R0042^^1.00000000~~R0049^^1.00000000~~R0072^^1.00000000~~R0088^^3.00000000~~R0092^^1.00000000~~R0106^^1.00000000
我如何遍历此列表并将名称和值插入数据库table,因为我正在努力了解不同分隔符及其相关值的使用。
非常感谢 江城
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,"(~|\^)","","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,"(~|\^)","","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}","","ALL")
,这将实现相同的目标,但还有一个额外的好处,即更易于阅读的人可能对正则表达式不太满意。
我会采取稍微不同的方法(出于我评论中所述的原因......如果数据中存在字符序列 ~^
或 ^~
,甚至单个字符 ^
或 ~
?) 并将列表转换为 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") & """}]" />
然后遍历数组以插入数据库。