当前位置: 首页 > article >正文

JMeter通过BeanShell如何对CSV文件的指定列追加数据

在 JMeter 中实现向 CSV 文件的 指定列追加数据,需根据场景选择不同方法。以下是两种典型场景的实现方案:


场景 1:生成新行时填充指定列的数据

若每次请求生成一行新数据,并在特定列填充动态值(如第三列),可以通过拼接变量实现:

步骤:
  1. 定义 CSV 表头:确保 CSV 文件已存在或首行包含列名(如 列1,列2,列3)。
  2. 使用 BeanShell/JSR223 脚本:动态拼接数据并写入 CSV。
import java.io.FileOutputStream;
import java.io.OutputStreamWriter;

// CSV 文件路径
String csvFilePath = "C:/test/output.csv";

// 从 JMeter 变量获取动态值
String column1 = vars.get("column1"); // 第一列数据
String column2 = vars.get("column2"); // 第二列数据
String column3 = "动态值";            // 指定列(第三列)数据

// 拼接行数据(逗号分隔)
String rowData = column1 + "," + column2 + "," + column3;

// 写入 CSV(UTF-8 编码,追加模式)
try (OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(csvFilePath, true), "UTF-8")) {
    // 如果是新文件,写入表头
    if (new File(csvFilePath).length() == 0) {
        writer.write("列1,列2,列3\n");
    }
    writer.write(rowData + "\n");
} catch (Exception e) {
    e.printStackTrace();
}

场景 2:修改现有 CSV 的指定列(覆盖或追加)

若需修改已有 CSV 文件中某列的值(例如根据条件更新第三列),需读取整个文件、修改数据后重写:

步骤:
  1. 使用 OpenCSV 库:简化 CSV 读写操作。
    • 下载 OpenCSV JAR 并放入 JMeter 的 lib 目录。
  2. 读取 CSV → 修改指定列 → 写回文件
import com.opencsv.CSVReader;
import com.opencsv.CSVWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.util.List;

String csvFilePath = "C:/test/output.csv";
int targetColumnIndex = 2; // 第三列(索引从 0 开始)

// 1. 读取 CSV 全部数据
List<String[]> csvData;
try (CSVReader reader = new CSVReader(new FileReader(csvFilePath))) {
    csvData = reader.readAll();
}

// 2. 修改指定列的数据(示例:为每一行的第三列追加 "_new")
for (String[] row : csvData) {
    if (row.length > targetColumnIndex) {
        row[targetColumnIndex] = row[targetColumnIndex] + "_new";
    }
}

// 3. 将修改后的数据写回 CSV
try (CSVWriter writer = new CSVWriter(new FileWriter(csvFilePath))) {
    writer.writeAll(csvData);
}

关键注意事项

  1. 并发写入问题

    • 如果多线程同时操作同一文件,需使用同步锁或避免并发写入。
    • 示例(在 BeanShell 中加锁):
      synchronized("fileWriteLock") { // 全局锁
          // 写入文件的代码
      }
      
  2. 性能优化

    • 频繁读写大文件会降低性能,建议仅在必要时操作 CSV。
    • 可考虑将数据暂存到内存,测试结束后一次性写入。
  3. 动态列管理

    • 若列位置不固定,建议先读取表头确定列索引:
      String[] header = csvData.get(0);
      int targetColumnIndex = Arrays.asList(header).indexOf("列名");
      

总结

  • 追加新行:直接拼接数据并写入,适合按请求生成独立记录。
  • 修改现有列:使用 OpenCSV 读取→修改→覆盖,适合批量更新。
  • 根据需求选择方案,优先确保编码(UTF-8)和并发安全。

http://www.kler.cn/a/539971.html

相关文章:

  • 前端 CSS 动态设置样式::class、:style 等技巧详解
  • 快速上手——.net封装使用DeekSeek-V3 模型
  • 计算机视觉-拟合
  • CodeGPT + IDEA + DeepSeek,在IDEA中引入DeepSeek实现AI智能开发
  • 对于 useMemo 的理解及解析
  • 除了wps还有什么表格软件可以在上面切换不用单独启动窗口
  • 智能理解 PPT 内容,快速生成讲解视频
  • 排错 -- 用React.js,Solidity,智能合约构建最新区块链应用
  • Pixel3XL 编译源码刷机教程
  • undetected-chromedriver 使用教程,指定浏览器驱动和浏览器版本
  • 运行npm install卡住不动的
  • 22.2、Apache安全分析与增强
  • 【数据结构】_栈与队列经典算法OJ:栈与队列的互相实现
  • 深度学习 语音合成
  • Java并发编程笔记
  • C++使用Json保存配置参数
  • 【计算机网络基础】ACL
  • 【Redis keys命令有什么问题?】
  • Android内存性能优化量化指标
  • 深度卷积神经网络实战海洋动物图像识别
  • 网络基础知识与配置
  • 《ARM64体系结构编程与实践》学习笔记(三)
  • 7 使用 Pydantic 验证 FastAPI 的请求数据
  • 网站快速收录策略:提升爬虫抓取效率
  • 2025Stable Diffusion WebUI详细使用指南
  • Spring Boot Actuator EndPoints(官网文档解读)