JMeter,如何将JDBC查询结果写成csv,包括列名?

时间:2018-01-02 18:53:55

标签: jmeter

我想把我的JDBC查询的结果写成csv文件,包括一行包含列的名称。

我能够通过定义一个JDBC PreProcessor来编写结果,我在其中将Result variable name分配给resultSet,以及一个JSR223 PreProcessor,其中包含以下脚本以写入csv。

但是,vars.getObject("resultSet");返回的变量是Collection,因此我无法获取列名信息。是否可以将ResultSet对象传递给JSR223 PreProcessor,以便我可以导出列名?

resultSet = vars.getObject("resultSet");
result = new StringBuilder();

//for (int i = 0; i <= resultSet.getMetaData().getColumnCount(); i++) {
//  result.append(resultSet.getMetaData().getColumnName(i));
//  result.append(',');
//}
//result.append(System.getProperty("line.separator"));

for (Object row : resultSet ) {
    iter = row.entrySet().iterator();
    while (iter.hasNext()) {
        pair = iter.next();
        result.append(pair.getValue());
        result.append(",");
    }
    result.append(System.getProperty("line.separator"));
}

org.apache.commons.io.FileUtils.writeStringToFile(new File("/tmp/data", "results.csv"), result.toString(), "UTF-8");

2 个答案:

答案 0 :(得分:1)

您的resultSet 已有列名称。根据{{​​3}}文章:

  

如前所述,关于使用Result Variable Name,它是Debugging JDBC Sampler Results in JMeter ArrayList,每个结果集行有一个地图。映射条目计数取决于列值,映射条目名称将与结果集列名称相同,映射条目值将是值本身。

因此,您需要修改代码以读取列名称,例如:

resultSet = vars.getObject("resultSet")
result = new StringBuilder()

def randomRow = resultSet.get(org.apache.commons.lang3.RandomUtils.nextInt(0,resultSet.size()))

randomRow.each { k, v -> 
    result.append("${k}").append(",")
}
result.append(System.getProperty("line.separator"))

for (Object row : resultSet ) {
    iter = row.entrySet().iterator()
    while (iter.hasNext()) {
        pair = iter.next()
        result.append(pair.getValue())
        result.append(",")
    }
    result.append(System.getProperty("line.separator"))
}

org.apache.commons.io.FileUtils.writeStringToFile(new File("foo.csv"), result.toString(), "UTF-8")

答案 1 :(得分:0)

Java中有许多CSV库,Apache Commons CSV,https://commons.apache.org/proper/commons-csv/,OpenCSV,http://opencsv.sourceforge.net/

就个人而言,我没有尝试运行SELECT * FROM table_name;这样的通用SQL语句,而是具体说明了您实际需要的列。然后,您知道要将哪些列名添加到CSV文件中。

如果您确实想创建一些也可以解析列名称的通用名称,这个答案可能会提供您正在寻找的内容 - Retrieve column names from java.sql.ResultSet