You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jmeter中如何通过JSR223 PreProcessor分批循环读取CSV

实现循环分批读取CSV数据的解决方案

你的需求可以通过全局变量跟踪读取位置+缓存CSV内容来实现,既保证每次取50行,又避免重复读取文件浪费资源。修改后的JSR223 PreProcessor代码如下:

// 配置参数
def batchSize = 50
def csvPath = 'locations.csv'

// 全局变量初始化:仅第一次运行时读取CSV并初始化起始行
if (!vars.getObject('csvLines')) {
    // 读取所有行并缓存到全局变量,避免重复IO
    def allLines = new File(csvPath).readLines()
    vars.putObject('csvLines', allLines)
    // 起始行:原代码从index=1开始,这里对应跳过第0行(假设是标题行),如果无标题则设为0
    vars.put('currentStartRow', '1')
}

def csvLines = vars.getObject('csvLines')
def currentStart = vars.get('currentStartRow') as int
def content = [:]
def body = []

// 计算当前批次的结束行,避免超出总行数
def currentEnd = Math.min(currentStart + batchSize - 1, csvLines.size() - 1)

// 读取当前批次的行
(currentStart..currentEnd).each { index ->
    def values = csvLines[index].split(',')
    def entry = [:]
    entry.put("sAddress", values[0])
    entry.put("sPostcode", values[1])
    entry.put("sID", values[2])
    body.add(entry)
}

// 更新下一次读取的起始行
vars.put('currentStartRow', String.valueOf(currentEnd + 1))

// 构建请求体
content.put('data', body)
sampler.addNonEncodedArgument('', new groovy.json.JsonBuilder(content).toPrettyString(), '')
sampler.setPostBodyRaw(true)

关键说明:

  • 全局变量缓存:用vars.getObject('csvLines')把CSV所有内容存在内存里,只读取一次,大幅提升性能。
  • 起始行跟踪:currentStartRow记录下一批要读取的起始位置,每次循环后更新为当前批次的结束行+1。
  • 边界处理:用Math.min确保最后一批数据不会超出CSV总行数,避免索引越界。
  • 兼容原逻辑:保留了原代码从第1行开始读取的逻辑(假设CSV第0行是标题),如果你的CSV没有标题行,把初始化currentStartRow的'1'改成'0'即可。

线程组配置:

确保线程组的循环次数设置为100次(因为5000行/50行每批=100批),或者可以添加逻辑判断,当currentStartRow超过CSV总行数时终止循环。

内容的提问来源于stack exchange,提问作者Siobhan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 14:05:17