VSCodeでTSVからSQLのInsert文を作成するマクロ

この記事は公開から3年以上経過しています。

今回はVSCodeで選択範囲のTSVをSQL Insert文に変換するVSCodeMacros拡張のマクロを作ってみたので紹介します。

このマクロはEXCEL上の大量のデータをDBに登録する際、EXCELの計算式やVBAで変換するよりもVSCodeマクロを書いたほうが個人的に断然効率が良いということで即席で作ったものですが、マクロに少し手を加えればCSVなど別のデータを変換することも可能です。

マクロの動作イメージ

ダミーのTSVファイルをSQL Insert文に変換している様子です。

マクロのサンプルソースコード

const vscode = require('vscode');

/**
 * マクロコンフィギュレーション
 */
module.exports.macroCommands = {
  TSV2SQLInsert: {
    no: 1,
    func: TSV2SQLInsert,
  },
};

/**
 * TSVからSQL Insert文を作成
 */
async function TSV2SQLInsert() {
  const editor = vscode.window.activeTextEditor;
  if (!editor) {
    return 'Editor is not opening.';
  }
  const document = editor.document;
  const selection = editor.selection;

  // 改行コード
  const eol = {
    1: '\n',
    2: '\r\n',
  }[document.eol];
  // DBの列のデータ型(0:text, 1:number)
  const dbColumnTypes = [0, 1, 1, 0];

  // 選択範囲のテキストを改行コードで分割
  const tsvRows = document.getText(selection).split(eol);
  let sqlRows = [];

  tsvRows.forEach((row) => {
    if (row.length > 0) {
      // Split line
      const columnValues = row.split('\t').map((s, i) => {
        if (dbColumnTypes[i] === 0)
          // 値が文字列型のときはシングルクォートで囲む
          return `'${s}'`;
        else return s;
      });
      const sql = `INSERT INTO XXX_TBL VALUES(${columnValues.join(',')});`;
      sqlRows.push(sql);
    }
  });

  const sqlDoc = await vscode.workspace.openTextDocument({
    language: 'SQL',
    content: sqlRows.join(eol),
  });
  await vscode.window.showTextDocument(sqlDoc);
}

GitHub Gist

使い方

  1. 生成したいSQLに合わせてソース中のsql変数とdbColumnTypes変数を編集します。dbColumnTypesはInsert文のVALUES()内に展開するデータ型タイプを表す配列で、列がテキスト型の場合は0、数値型の場合は1を設定します。

  2. EXCELのような表計算ソフトにて表データを選択&コピーしてVSCodeに貼り付けます。

  3. 前手順で貼り付けたTSV形式のデータを選択してこのマクロを実行すると、選択データをSQLのInsert文に変換して新しいタブページに表示します。

エラーチェックなどは行っていないので、必要なら適宜行ってください。

変換前:

Foo 100 0.1 OK
Bar 200 0.2 NG
Baz 300 0.3 -

変換後:

INSERT INTO XXX VALUES('Foo',100,0.1,'OK');
INSERT INTO XXX VALUES('Bar',200,0.2,'NG');
INSERT INTO XXX VALUES('Baz',300,0.3,'-');

以上です。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする