正規表現・サクラエディタマクロについて質問です。
下のようなタブ区切りのテキストがあります。
国語 90 55 数学 80 65 理科 70 75 社会 60 85 英語 50 95
これを下のように行と列を入れかえたタブ区切りのテキストにしたいです。
国語 数学 理科 社会 英語 90 80 70 60 50 55 65 75 85 95
サクラエディタの置換・マクロを用いて可能でしょうか?
最悪の場合はサクラエディタ以外のテキストエディタでも構いません。
ただ、Excelなどで行と列を入れ替えたりといった回答は求めていません。
使える環境はテキストエディタのみという前提でお願いします。
(VBScriptやJavascriptといったWindows標準で使えるスクリプトも使えない環境です。)
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/13 07:21
2017/08/13 07:30 編集
2017/08/13 13:09 編集
2017/08/13 13:13 編集

回答4件
0
ベストアンサー
最悪の場合はサクラエディタ以外のテキストエディタでも構いません。
とのことですので、Atomで実現しました。
###スクリーンショット
###設定方法
メニューの File -> Init Script... から init.coffeeを開き、下記コードを書き込んで保存します。
CoffeeScript
1# Traspose Matrix for Atom 2# Copyright (c) 2017 raccy 3# This software is released under the MIT License. 4# https://opensource.org/licenses/MIT 5 6getLineEndings = (str) -> 7 lfIndex = str.search(/\n/) 8 if lfIndex == -1 9 if process.platform == 'win32' 10 '\r\n' 11 else 12 '\n' 13 else if lfIndex == 0 or str[lfIndex - 1] != '\r' 14 '\n' 15 else 16 '\r\n' 17 18lineSplit = (str, lineEndings) -> 19 lines = str.split(lineEndings) 20 oLen = lines.length 21 if oLen > 0 && lines[oLen - 1].length == 0 22 lines.slice(0, oLen - 1) 23 else 24 lines 25 26transposeMatrix = (matrix) -> 27 hSize = matrix.length 28 wSize = Math.max.apply(null, matrix.map((line) -> line.length)) 29 matrix[x][y] for x in [0...hSize] for y in [0...wSize] 30 31atom.commands.add 'atom-workspace', 'custom:transpose-tsv', -> 32 editor = atom.workspace.getActiveTextEditor() 33 return unless editor 34 text = editor.getText() 35 return unless text 36 lineEndings = getLineEndings(text) 37 textMatrix = lineSplit(text, lineEndings).map (line) -> line.split('\t') 38 newTextMatrix = transposeMatrix(textMatrix) 39 newText = newTextMatrix.map((x) -> x.join('\t')).join(lineEndings) + 40 lineEndings 41 editor.setText(newText)
メニューの File -> Keymap... から keymap.cson を開き、下記コードを書き込んで保存します。(CSONはJSONのCoffeeScript版です)
CoffeeScript
1'atom-text-editor': 2 'ctrl-alt-t': 'custom:transpose-tsv'
両方のファイルを保存した後に、Atomを再起動します。
###使い方
上記設定済みのAtomで、タブ区切りのファイルを開いて、「Ctrl + Alt + T」を押すと行と列が入れ替わります。
###注意事項
- init.coffeeに書き込むコードについて**著作権は放棄していません。**MITライセンスですので、商用・非商用を問わず自由に使用することも販売することもできますが、最初の著作権とライセンス表記を削除しないでください。
- 一応テストはしていますが、バグがあっても自分で直してください。
- ""で囲まれている場合等は一切考慮していません。
- 改行はCRLFとLFの両方に対応しており、元々のテキストの最初の行の改行に従います。
- ショートカットキーはお好みで変更してください。
- プラグインは不要です。素のAtomだけで可能です。
###サクラエディタのWSHマクロ(JScript)版
JavaScriptは禁止されているようですが、サクラエディタのWSHマクロとしてJScriptが禁止されているのか(というか、どうやって禁止するんだろう)が質問への追記・修正依頼にありますが、未だにその回答がありません。WSHのJScriptはJavaScriptとは違うから使えるという前提にして、WSHマクロ(JScript)を書きました(というか、ただの移植ですが)。適当なファイルに保存して、サクラエディタの「名前を指定してマクロ実行」から実行してください。
JavaScript
1/** 2 * Traspose Matrix for Sakura Editor 3 * Copyright (c) 2017 raccy 4 * This software is released under the MIT License. 5 * https://opensource.org/licenses/MIT 6 */ 7(function() { 8 'use strict'; 9 var getLineEndings = function(str) { 10 switch(GetLineCode()) { 11 case 0: 12 return '\r\n'; 13 break; 14 case 1: 15 return '\r'; 16 break; 17 case 2: 18 return '\n'; 19 break; 20 } 21 } 22 var lineSplit = function(str, lineEndings) { 23 var lines = str.split(lineEndings); 24 var oLen = lines.length; 25 if (oLen > 0 && lines[oLen - 1].length === 0) { 26 return lines.slice(0, oLen - 1); 27 } else { 28 return lines; 29 } 30 }; 31 var transposeMatrix = function(matrix) { 32 var hSize = matrix.length; 33 var wSize = 0; 34 var i, len; 35 for (i = 0; i < hSize; i++) { 36 len = matrix[i].length; 37 if (len > wSize) { 38 wSize = len; 39 } 40 } 41 var results = []; 42 var x, y, line; 43 for (y = 0; y < wSize; y++) { 44 line = []; 45 for (x = 0; x < hSize; x++) { 46 line.push(matrix[x][y]); 47 } 48 results.push(line); 49 } 50 return results; 51 }; 52 var transposeAll = function() { 53 var i, len; 54 SelectAll(); 55 var text = GetSelectedString(0); 56 if (!text) { 57 return; 58 } 59 var lineEndings = getLineEndings(text); 60 var splitedText = lineSplit(text, lineEndings); 61 var textMatrix = []; 62 for (i = 0, len = splitedText.length; i < len; i++) { 63 textMatrix.push(splitedText[i].split('\t')); 64 } 65 var newTextMatrix = transposeMatrix(textMatrix); 66 var newTextLines = []; 67 for (i = 0, len = newTextMatrix.length; i < len; i++) { 68 newTextLines.push(newTextMatrix[i].join('\t')); 69 } 70 newText = newTextLines.join(lineEndings) + lineEndings; 71 InsText(newText); 72 }; 73 transposeAll(); 74})();
ES6以降が使えないのはまだしも、Array.prototype.mapすらないJScriptがきつい。もう、二度と書きたくない。
投稿2017/08/14 04:55
編集2017/08/14 12:02総合スコア21741
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
サクラの正規表現がどこまで置換可能かわかりませんが
単純に以下でどうでしょう?
(ものによっては10以上の置換に対応しない場合もあるので微妙)
- 置換元
(.+?)\t(.+?)\t(.+?)\n(.+?)\t(.+?)\t(.+?)\n(.+?)\t(.+?)\t(.+?)\n(.+?)\t(.+?)\t(.+?)\n(.+?)\t(.+?)\t(.+?)\n
- 置換先
\1\t\4\t\7\t\10\13\n\2\t\5\t\8\t\11\14\n\3\t\6\t\9\t\12\15\n
投稿2017/08/14 01:51
総合スコア117615
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/14 02:42

0
テキストエディタのみということなので、条件に合わなければスルーして頂いて構いません。
エクセルでの意図しない属性変更のようなことは無く、だけど、エクセルライクに使用できるCSVエディターを紹介します。
Cassava Editor
記事は古いですが窓の杜でも紹介されています。
このソフトであればファイルを開き、「転置」(メニュー→マクロ)を選択するだけで、行と列を入れ替えてくれます。
投稿2017/08/14 01:25
総合スコア25426
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
とりあえずキーマクロで解くことを考えます。
キーマクロのコマンドを取得するには3つの方法があります。
- ヘルプのマクロの項を読む
- メニューバーの[ヘルプ(H)]-[キー割り当て一覧をコピー(Q)]を選択して、適当な領域にペーストする
- キーマクロの記録を開始し、知りたい動作をし、キーマクロの記録終了&保存を行う
この問題を解くにあたって、1と2をやっておくことはほぼ必須ですが、本当に知りたい情報は3の方法でしか取得することができません。次の例を考えましょう。
text
1A B 2C D
(※タブは4スペースで代用している)
このテキストの行と列を入れ替えたものは、以下のようになります。
text
1A C 2B D
このテキストを取得するためには、次のようなキーマクロを用意する必要があると私は考えました。
text
1//キーボードマクロのファイル 2InsText("\r\n"); 3InsText("\r\n"); 4S_GoFileTop(0); // ファイルの先頭に移動 5S_Left(0); // カーソル左移動 6S_GoLineEnd(0); // 行末に移動(折り返し単位) 7InsText("A"); 8S_IndentTab(0); // TABインデント 9S_Down(0); // カーソル下移動 10InsText("B"); 11S_IndentTab(0); // TABインデント 12S_Down(0); // カーソル下移動 13S_GoFileTop(0); // ファイルの先頭に移動 14S_GoLineEnd(0); // 行末に移動(折り返し単位) 15InsText("C"); 16S_IndentTab(0); // TABインデント 17S_Down(0); // カーソル下移動 18InsText("D"); 19S_IndentTab(0); // TABインデント 20S_Down(0); // カーソル下移動 21S_GoFileTop(0); // ファイルの先頭に移動 22S_GoLineEnd(0); // 行末に移動(折り返し単位) 23S_DeleteBack(0); // カーソル前を削除 24S_Down(0); // カーソル下移動 25S_GoLineEnd(0); // 行末に移動(折り返し単位) 26S_DeleteBack(0); // カーソル前を削除 27S_Down(0); // カーソル下移動
このキーマクロを実行すると、行と列が入れ替わったテキストが取得できるはずです。では、このようなキーマクロはどのように作成するのでしょうか?まず、新規作成された状態から、カラムの分だけ改行する必要があります。次に、実際の各行の内容を慎重にマクロに置き換えます。そして、全ての行末のタブを削除しています。
このキーマクロを作成するためには、メニューバー[検索(S)]-[置換(R)...]のキーマクロが、キーとなります。これによって、タブ以外の部分を上記のコマンド群に置き換えていくのです。
これは、時間と気力があれば可能でしょう。そして、teratailには私よりも優れたプログラマがたくさんいらっしゃいますし、実際にサクラエディタなどのプロジェクトに参画しているメンバーであれば、いとも簡単にこれをやってのけるでしょう。だから、私はそのキーマクロを記述することを放棄したのです。
正直、この問題の出題者が、実は解けなさそうで実は解ける問題を出して、どのくらいで解いてくるのかを試しているのではないかと勘繰るところもあります。というか、Excel, VBScript, Javascriptが使えないということを言っている時点で、出題者はすくなくともプログラミングの経験がおありであり、上記の説明を読めば、ご自身で解決にもっていくことができるでしょう。
私からは以上です。
投稿2017/08/13 23:08
総合スコア667
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。