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
相关产品推荐
相关产品推荐

