CSV/TSVでアクティブ列選択
概要
このマクロは、CSVファイル内でアクティブな列を選択するためのものです。現在のカーソル位置を基準に、対応する列を自動的に全て選択します。
注意事項
- Mery Ver 3.7.9 で動作確認しています。
使い方
- MeryでCSVファイルを開く
- 選択したい列にカーソルを移動させる
- このマクロを実行すると、カーソル位置に対応する列が全て選択される
ソースコード
※2024/12/27 現在、ダブルクォーテーション内のカンマでフィールドがずれる問題や動作が重くなる問題を確認しています。改善に向け修正中です。
#title = "CSV/TSV でアクティブ列選択"
var CSV_ID = 1;
var TSV_ID = 2;
var doc = document;
var sel = doc.selection;
main();
function main() {
// 現在の列位置を取得
var actX = sel.GetActivePointX(mePosLogical);
var actY = sel.GetActivePointY(mePosLogical);
var line = doc.GetLine(actY);
var lineArray = line.split("");
var leftString = lineArray.slice(0, actX - 1).join("");
// CSVかTSVか判定
var menu = createContextMenu();
menuTrack = menu.Track(0);
// メニュー選択がキャンセルされた場合は終了
if (menuTrack === 0) return;
var fieldCount = 0;
var pattern = "";
if (menuTrack === CSV_ID) {
// CSVの場合
// フィールド数を計上
// ダブルクォート囲みも考慮する
var inDoubleQuote = false;
for (var i = 0; i < leftString.length; i++) {
if (leftString[i] == '"') {
inDoubleQuote = !inDoubleQuote;
}
if (!inDoubleQuote && leftString[i] == ',') {
fieldCount++;
}
}
// 検索パターン
if (fieldCount == 0) {
pattern = '^([^,]*|"[^",]*")';
} else {
pattern = '(?<=^([^,]*,|"[^",]*",){' + fieldCount + '})([^,]*|"[^",]*")';
}
} else {
// TSVの場合
// フィールド数を計上
fieldCount = leftString.split("\t").length - 1;
// 検索パターン
if (fieldCount == 0) {
pattern = '^[^\\t]*';
} else {
pattern = '(?<=^([^\\t]*\\t){' + fieldCount + '})[^\\t]*';
}
}
sel.Find(pattern, meFindReplaceRegExp + meFindAll + meFindKeepOptions);
}
function createContextMenu() {
const menu = CreatePopupMenu();
menu.Add("CSV でアクティブ列選択 (&C)", CSV_ID);
menu.Add("TSV でアクティブ列選択 (&T)", TSV_ID);
return menu;
}
スポンサーリンク