我想把我的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");
答案 0 :(得分:1)
您的resultSet
已有列名称。根据{{3}}文章:
如前所述,关于使用
Result Variable Name
,它是Debugging JDBC Sampler Results in JMeterArrayList
,每个结果集行有一个地图。映射条目计数取决于列值,映射条目名称将与结果集列名称相同,映射条目值将是值本身。
因此,您需要修改代码以读取列名称,例如:
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