Freemarker csv 按升序排序和 json 列表
Freemarker csv sorting in asc order and json listing
最近我玩了 lazerycode jmeter 分析插件,但无论我如何尝试通过 freemarker 生成数据我都未能达到我的目标,因为对于 csv ftl 我无法按 asc 顺序或 json ftl 我需要在复制列表后删除逗号以使其在 highcharts 中工作,因此我的问题是:
对于 CSV 数据,如何按升序对列表进行排序,尤其是 samples.minTimestamp:
<#ftl/>
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" -->
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors
<#list self?keys as key>
<#assign samples=self(key)/>
${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount} </br>
</#list>
对于这个 JSON 列表,我如何只列出这个块“},”一次(在 "stdDeviation" 之后),因为我需要删除“,”之后括号,否则我的图表不会呈现,我不想手动去删除每个文件上的逗号:
<#ftl/>
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" -->
<#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
<#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" -->
<#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" -->
<#if !self?keys?has_content>
"empty": {}
<#else>
{
<#list self?keys as key>
<#assign aggregatedResponses=self(key)/>
<#assign requests=aggregatedResponses.duration/>
<#assign total=requests.successCount + requests.errorsCount/>
<#assign quantiles=requests.getQuantiles(Q_QUANTILES)/>
<#if (requests.successCount > 0) >
"${key}":{
"y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}],
"requestStartTime": [${aggregatedResponses.start}],
"requestEndTime": [${aggregatedResponses.end}],
"duration": [${requests.duration}],
"numberOfRequests": [${requests.successCount}],
"requestsPerSec": [${requests.successPerSecond}],
"min": [${requests.min}],
"average": [${requests.average}],
"max": [${requests.max}],
"total": [${total}],
"stdDeviation": [${requests.standardDeviation}]
},
</#if>
</#list>
}
</#if>
谢谢。
<#if key_has_next>,</#if>
这将帮助您为除最后一项之外的所有项目设置“,”。
因此,您的代码将如下所示
<#ftl/>
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" -->
<#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
<#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" -->
<#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" -->
<#if !self?keys?has_content>
"empty": {}
<#else>
{
<#list self?keys as key>
<#assign aggregatedResponses=self(key)/>
<#assign requests=aggregatedResponses.duration/>
<#assign total=requests.successCount + requests.errorsCount/>
<#assign quantiles=requests.getQuantiles(Q_QUANTILES)/>
<#if (requests.successCount > 0) >
"${key}":{
"y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}],
"requestStartTime": [${aggregatedResponses.start}],
"requestEndTime": [${aggregatedResponses.end}],
"duration": [${requests.duration}],
"numberOfRequests": [${requests.successCount}],
"requestsPerSec": [${requests.successPerSecond}],
"min": [${requests.min}],
"average": [${requests.average}],
"max": [${requests.max}],
"total": [${total}],
"stdDeviation": [${requests.standardDeviation}]
}<#if key_has_next>,</#if>
</#if>
</#list>
}
</#if>
我的问题的解决方案是在同事的帮助下在内部解决的,因此我将它们张贴在这里:
CSV数据排序:
<#ftl/>
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" -->
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
<#assign sorted>
<#list self?keys as key>
<#assign samples=self(key)/>
${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount}
</#list>
</#assign>
minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors
<#list sorted?split("\n")?sort as line>
${line}
</#list>
对于JSON除最后一项“,”之外的所有元素的列表:
-----
"stdDeviation": [${requests.standardDeviation}]
}<#if (key_index+1) < self?keys?size>,</#if>
</#if>
</#list>
}
</#if>
最近我玩了 lazerycode jmeter 分析插件,但无论我如何尝试通过 freemarker 生成数据我都未能达到我的目标,因为对于 csv ftl 我无法按 asc 顺序或 json ftl 我需要在复制列表后删除逗号以使其在 highcharts 中工作,因此我的问题是:
对于 CSV 数据,如何按升序对列表进行排序,尤其是 samples.minTimestamp:
<#ftl/> <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" --> <#-- @ftlvariable name="key" type="java.lang.String" --> <#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" --> minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors <#list self?keys as key> <#assign samples=self(key)/> ${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount} </br> </#list>
对于这个 JSON 列表,我如何只列出这个块“},”一次(在 "stdDeviation" 之后),因为我需要删除“,”之后括号,否则我的图表不会呈现,我不想手动去删除每个文件上的逗号:
<#ftl/> <#-- @ftlvariable name="key" type="java.lang.String" --> <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" --> <#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" --> <#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" --> <#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" --> <#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" --> <#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" --> <#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" --> <#if !self?keys?has_content> "empty": {} <#else> { <#list self?keys as key> <#assign aggregatedResponses=self(key)/> <#assign requests=aggregatedResponses.duration/> <#assign total=requests.successCount + requests.errorsCount/> <#assign quantiles=requests.getQuantiles(Q_QUANTILES)/> <#if (requests.successCount > 0) > "${key}":{ "y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}], "requestStartTime": [${aggregatedResponses.start}], "requestEndTime": [${aggregatedResponses.end}], "duration": [${requests.duration}], "numberOfRequests": [${requests.successCount}], "requestsPerSec": [${requests.successPerSecond}], "min": [${requests.min}], "average": [${requests.average}], "max": [${requests.max}], "total": [${total}], "stdDeviation": [${requests.standardDeviation}] }, </#if> </#list> } </#if>
谢谢。
<#if key_has_next>,</#if>
这将帮助您为除最后一项之外的所有项目设置“,”。 因此,您的代码将如下所示
<#ftl/>
<#-- @ftlvariable name="key" type="java.lang.String" -->
<#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.parser.AggregatedResponses>" -->
<#-- @ftlvariable name="requests" type="com.lazerycode.jmeter.analyzer.statistics.Samples" -->
<#-- @ftlvariable name="aggregatedResponses" type="com.lazerycode.jmeter.analyzer.parser.AggregatedResponses" -->
<#-- @ftlvariable name="Q_QUANTILES" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="K_99_PONT_9_PERCENT" type="java.lang.Integer" -->
<#-- @ftlvariable name="PERCENT_100" type="java.lang.Integer" -->
<#if !self?keys?has_content>
"empty": {}
<#else>
{
<#list self?keys as key>
<#assign aggregatedResponses=self(key)/>
<#assign requests=aggregatedResponses.duration/>
<#assign total=requests.successCount + requests.errorsCount/>
<#assign quantiles=requests.getQuantiles(Q_QUANTILES)/>
<#if (requests.successCount > 0) >
"${key}":{
"y":[0,${quantiles.getQuantile(10*10)?string},${quantiles.getQuantile(20*10)?string},${quantiles.getQuantile(30*10)?string},${quantiles.getQuantile(40*10)?string},${quantiles.getQuantile(50*10)?string},${quantiles.getQuantile(60*10)?string},${quantiles.getQuantile(70*10)?string},${quantiles.getQuantile(80*10)?string},${quantiles.getQuantile(90*10)?string},${quantiles.getQuantile(K_99_PERCENT)?string},${quantiles.getQuantile(K_99_PONT_9_PERCENT)?string},${quantiles.getQuantile(Q_QUANTILES)?string}],
"requestStartTime": [${aggregatedResponses.start}],
"requestEndTime": [${aggregatedResponses.end}],
"duration": [${requests.duration}],
"numberOfRequests": [${requests.successCount}],
"requestsPerSec": [${requests.successPerSecond}],
"min": [${requests.min}],
"average": [${requests.average}],
"max": [${requests.max}],
"total": [${total}],
"stdDeviation": [${requests.standardDeviation}]
}<#if key_has_next>,</#if>
</#if>
</#list>
}
</#if>
我的问题的解决方案是在同事的帮助下在内部解决的,因此我将它们张贴在这里:
CSV数据排序:
<#ftl/> <#-- @ftlvariable name="self" type="java.util.Map<java.lang.String, com.lazerycode.jmeter.analyzer.statistics.Samples>" --> <#-- @ftlvariable name="key" type="java.lang.String" --> <#-- @ftlvariable name="samples" type="com.lazerycode.jmeter.analyzer.statistics.Samples" --> <#assign sorted> <#list self?keys as key> <#assign samples=self(key)/> ${samples.minTimestamp},${samples.maxTimestamp},"${key}",${samples.successCount},${samples.average},${samples.standardDeviation},${samples.errorsCount} </#list> </#assign> minTimestamp,maxTimestamp,uri,count,average,standarddeviation,errors <#list sorted?split("\n")?sort as line> ${line} </#list>
对于JSON除最后一项“,”之外的所有元素的列表:
----- "stdDeviation": [${requests.standardDeviation}] }<#if (key_index+1) < self?keys?size>,</#if> </#if> </#list> } </#if>