1. 程式人生 > >idea自定義數據導出格式

idea自定義數據導出格式

scripts odi val 定義數據 HA int idea mysq 腳本

最近需要從數據庫導出特定格式的數據,寫代碼導太麻煩了,試了幾個mysql客戶端都只能導固定格式的,最後發現idea的Database工具可以自定義導出的格式,所以就試了下。

導出功能在這個位置

技術分享圖片

當然這些是idea默認的,想自定義點擊Go to Scripts Directory

技術分享圖片

可以直接修改原來的腳本,也可以新建,新建的也會在剛才的右鍵菜單裏顯示,很方便。
從原來的腳本可以看出,idea支持三種腳本語言:js、groovy和clojure,可以用自己熟悉的語言寫,這裏我選的是js。
最終導出的文件後綴名是由腳本的文件名決定的,如xxx.xml.js,導出的文件是xml格式的。

數據庫的信息可以直接從上下文中取,分別有:
COLUMNS List<DataColumn> // 每一列的信息
DataColumn { columnNumber(), name() } // 列信息對象有兩個方法,取列序號和列名

ROWS Iterable<DataRow> //第一行的信息
DataRow { rowNumber(); first(); last(); data(): List<Object>; value(column): Object } //行對象

OUT { append() } // 這個是用來輸出到文件
FORMATTER { format(row, col); formatValue(Object, col) } //取某行某列的值

TABLE // 整個表的信息,最常用的是TABLE.getName(),獲取表名

function eachWithIdx(iterable, f) { var i = iterable.iterator(); var idx = 0; while (i.hasNext()) f(i.next(), idx++); }
// 特殊字符轉義
function escape(str) {
    str = str.replaceAll("\t|\b|\\f|\\r|\\n|\\r\\n", "");
    str = com.intellij.openapi.util.text.StringUtil.escapeXml(str);
    str = str.replaceAll("\"", """);
    if (str == null || str == ‘NULL‘ || str == ‘null‘) {
        str = ‘‘;
    }
    return str;
}

// 換行
var NEWLINE = "\n";

function output() { for (var i = 0; i < arguments.length; i++) { OUT.append(arguments[i]); } }

output("<?xml version=\"1.0\" encoding=\"UTF-8\"?>", NEWLINE);
output("<dataset>", NEWLINE);

eachWithIdx(ROWS, function (row) {
    output("    <", TABLE.getName());
    eachWithIdx(COLUMNS, function (col) {
        output(" " + col.name(), "=\"", escape(FORMATTER.format(row, col)), "\"");
    });
    output(" />", NEWLINE);
});

output("</dataset>")

生成的文件格式

<?xml version="1.0" encoding="UTF-8"?>
<dataset>
    <sys_user id="1" username="123" password="123" mobile="123" />
    <sys_user id="2" username="321" password="123" mobile="222555" />
    <sys_user id="3" username="111" password="321" mobile="12313" />
</dataset>

技術分享圖片

idea自定義數據導出格式