質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

Q&A

解決済

4回答

10886閲覧

テキストエディタで行と列を入れ替える

yrema

総合スコア286

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

置換

置換とは文字列中の特定の文字に対して、別の文字列に置き換えることを指します。

0グッド

0クリップ

投稿2017/08/13 06:50

正規表現・サクラエディタマクロについて質問です。

下のようなタブ区切りのテキストがあります。

国語 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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kei344

2017/08/13 07:17

ブラウザも使用できない環境ですか?
yrema

2017/08/13 07:19

ブラウザは使用できますが、質問文に書いてある通りJavascriptは使えません。また、外部へのアクセスもできません。
kei344

2017/08/13 07:21

ブラウザのJavaScriptの実行が制限されている環境なのでしょうか?
yrema

2017/08/13 07:25

ブラウザは決められたページしか閲覧できません。Javascript以外の方法でお願いします。
kei344

2017/08/13 07:30 編集

ブラウザには管理者ツールというものが有り、そこに実行環境があるためそれが制限されていないなら回答の幅が広がると思います。
think49

2017/08/13 13:09 編集

ブラウザはローカルファイルを閲覧することが可能です。ローカルでの動作に制限があるなら使えないといえますが。
CHERRY

2017/08/13 13:13 編集

サクラエディタのマクロで、WSH や PPA はつかえるのでしょうか?
guest

回答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
raccy

総合スコア21735

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2017/08/14 03:26

kei344さん、いつもありがとうございます サクラでは難しそうですね ちなみに私の使うエディタでは改行は越せるのですが 10以上の置換ができません(\10を\1+0と理解する)
guest

0

テキストエディタのみということなので、条件に合わなければスルーして頂いて構いません。

エクセルでの意図しない属性変更のようなことは無く、だけど、エクセルライクに使用できるCSVエディターを紹介します。

Cassava Editor
記事は古いですが窓の杜でも紹介されています。

このソフトであればファイルを開き、「転置」(メニュー→マクロ)を選択するだけで、行と列を入れ替えてくれます。

投稿2017/08/14 01:25

sazi

総合スコア25195

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

とりあえずキーマクロで解くことを考えます。

キーマクロのコマンドを取得するには3つの方法があります。

  1. ヘルプのマクロの項を読む
  2. メニューバーの[ヘルプ(H)]-[キー割り当て一覧をコピー(Q)]を選択して、適当な領域にペーストする
  3. キーマクロの記録を開始し、知りたい動作をし、キーマクロの記録終了&保存を行う

この問題を解くにあたって、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

anndonut

総合スコア667

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問