【问题标题】:coldfusion 11 loop in rightful way以正确的方式进行coldfusion 11循环
【发布时间】:2021-08-08 00:31:40
【问题描述】:

我在其中一个页面中看到此代码,看起来很烦人,如果我在 Coldfusion 11 上,它可以被缩短 https://trycf.com/gist/701515844d5e41549a7b6e61dfafeaa0/lucee5?theme=monokai

这是代码的样子

<cfloop list="#mqry.columnList#" index="col">
<cfset ColRow ="#mqry.columnList#," >                     
</cfloop>  


<cfset  x = replace(ColRow,"CONDITION1","CONDITION") & chr(13) & chr(10)>
<cfloop query="mqry">               
<cfloop list="#mqry.columnList#" index="colN"> 
    <cfset f = Replace("#mqry[colN][currentRow]#" ,"""","","All")>
    <cfset f = REReplaceNoCase("#mqry[colN][currentRow]#" , "<[^>]*(?:>|$)", "", "ALL")>
    <cfset x = x & """#_f#"",">  
</cfloop> 
<cfset  x = x & chr(13) & chr(10)>                          
</cfloop>

我认为我可以做到的第一个值:

mquery.columnlist - no need to loop over 

【问题讨论】:

  • 看起来您正试图从查询中生成 CSV?每个单元格值前面的下划线是故意的吗?为什么每一行都以分隔符,结尾?
  • 是的,尝试生成 csv,它可以工作,但它的编写方式非常奇怪,我正在尝试简化它并从这里删除不必要的循环,我已经更新了我的要点
  • 所有回车的目的是什么?
  • @DanBracuk 你指的是“CRLF vs LF”吗?因为 CSV 需要换行符,并且列标题有一个,每一行都有一个。目的应该明确。

标签: coldfusion lucee


【解决方案1】:

嵌套循环没有任何问题。您遍历所有行,然后使用列名遍历每行的每个单元格。我重写了你的代码以便更容易理解:

<cfset NEWLINE = (chr(13) & chr(10))>
<cfset DELIM   = ",">
<cfset QUOTE   = '"'>

<!--- column headers --->
<cfset x = mqry.columnList>

<!--- replace column names as desired --->
<cfset x = replace(x, "CONDITION1", "CONDITION")>

<!--- next line --->
<cfset x &= NEWLINE>

<cfloop query="mqry">

    <cfset row = []>

    <cfloop list="#mqry.columnList#" index="colN">

        <cfset cellValue = mqry[colN][mqry.currentRow]>

        <!--- remove all quotes --->
        <cfset cellValue = replace(cellValue, QUOTE, "", "ALL")>

        <!--- remove tags --->
        <cfset cellValue = reReplaceNoCase(cellValue, "<[^>]*(?:>|$)", "", "ALL")>

        <!--- prefix with underscore --->
        <cfset cellValue = ("_" & cellValue)>

        <!--- wrap in quotes --->
        <cfset cellValue = (QUOTE & cellValue & QUOTE)>

        <cfset row.add(cellValue)>

    </cfloop>

    <!--- combine cell values into a row --->
    <cfset x &= arrayToList(row, DELIM)>

    <!--- next line --->
    <cfset x &= NEWLINE>

</cfloop>

<cfoutput>#x#</cfoutput>

【讨论】:

  • 谢谢@alex,我添加了我更新的要点,我在其中分享了三个循环,一个主循环运行 10 次,然后创建文件,我希望你可能已经看到我的更新要点...
  • 我假设您正在执行 10 条不同的 SQL 语句并从每个结果集中生成一个 CSV 文件,对吧?那有什么问题呢?
  • 它似乎超时并且需要很多时间,我想通过使用其他任何可以使其处理更快的数组来使它变得更好,也许是将查询转换为 csv 的直接方法什么的,
  • 然后从测量零件开始。确保不是查询时间过长。您可以尝试使用java.lang.StringBuilder 优化串联。将columnList 转换为数组也可能会稍微快一些。但只有在处理非常大的列表时,这些优化才开始变得重要。到那时,内存也开始变得重要,因为次要收集可能会开始增加。您的结果集中有多少条记录?
  • 记录非常庞大,因此通常 10 次中有 8 次超时,我尝试将查询单独运行,似乎不会花费太多时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-01-27
  • 2020-09-15
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多