タイトルがきめれない。(仮)

おっさん(つまらないサラリーマン)の備忘録

Windows 備忘録

【備忘録】テキストファイルから任意の文字列を抽出する

投稿日:2018年8月10日 更新日:

仕事で3万行ぐらいあるそこそこ規則的なテキストファイルから任意の文字列を抽出しました。
今後も同じことを何度かやるので備忘録として、完全に個人的なメモです。

例えばこんな感じのテキストデータから、任意の文字列を抽出したい。

食事のログかなんかだと思っていただければ幸い。
日付の後にくるのがその日に摂取した炭水化物、炭水化物の後に角括弧[]で囲まれている部分がその日の炭水化物のトッピングでいわゆる「ご飯の友」、そのうしろがひと言メモという構成。

抽出したいのは白米だった日のご飯の友、ついでに重複する文字列は削除してひとつにしたい。最終的に目標とする形は下のようなもの。

実際にはもっと複雑な構成のログファイルから特定の操作を行ったIPアドレスを抽出する作業をしています。上の例文程度ならもっと効率的な方法があると思うし、僕がアホなだけでもっと簡単に処理できる方法は絶対にあるはず。

使ったもの(環境)

  • Windows 10
  • Mery Ver 2.6.7 (テキストエディタ)

下準備

Meryの機能を拡張するため、マクロを追加します。

  1. テキスト整形 -MeryWiki にアクセスし、『スターターパック』の項目にある『テキスト整形.zip』をダウンロード。
  2. ZIPファイルを展開し、ファイルふたつをMeryのインストールフォルダにある『Macros』フォルダにコピー。
  3. Meryを起動し、メニューの『マクロ』→『カスタマイズ』を開く。
  4. 『マクロのカスタイマイズ』というウインドウが開いたら『追加』をクリックし、保存した『テキスト整形.js』を開く。『OK』ボタンを押して『マクロのカスタイマイズ』ウインドウを閉じれば準備完了。

手順

1.特定の行だけを抽出

まずは『白米』と書かれた行のみを残し、その他の行を削除します。

  1. Meryでファイルを開き、テキストをすべて選択。
  2. メニューから『マクロ』→『テキスト整形』を選択。さらにコンテキストメニューみたいなものが表示されるので、『除去/削除』→『入力文字列を含む行を削除…』を選択。
  3. 表示されるウインドウに『白米』と入力して『OK』ボタンをクリック。

パンとかパスタの行が消えて、下のようになります。

2.特定の文字列を抽出

各行の『白米』に続く角括弧内の文字だけを抽出します。
角括弧内の文字列は不規則なので、各行とも括弧開き以前と括弧閉じ以降の文字列を削除し、角括弧内の文字列のみを残す方法を取ります。

括弧開き以前を削除

メニューから『検索』→『置換』を選択。
『置換』ウインドウが開いたら『正規表現を使用する』にチェックを入れ、『検索する文字列』に下のとおり入力。

最初のドットとアスタリスクは正規表現で「任意の文字が0個以上」という意味。4文字目は指定したい半角の角括弧開き。半角の角括弧は正規表現の処理でも使われる文字なので、今回は処理用ではなく文字として扱うよう、3文字目にバックスラッシュ(Windowsだと\マーク)を入れます。

『置換後の文字列』は空欄のまま、『すべて置換』をクリックします。結果は下のとおり。

括弧閉じ以降を削除

やり方は括弧開き以前を削除したときと同じ。『検索する文字列』のみ下のとおり変更します。

これで「角括弧閉じ以降の0個以上の任意の文字列」という意味になります。『すべて置換』をクリックしたあとの結果は下のとおり。

3.重複する文字列(同じ内容の行)を削除してひとつにする。

今回は統計をとるわけではなく単純に種類を知りたいだけなので、同じ内容の行がふたつ以上あった場合は削除し、ひとつだけ残します。操作は特定の行だけを抽出したときとほぼ同じ。

  1. テキストをすべて選択。
  2. メニューから『マクロ』→『テキスト整形』を選択。さらにコンテキストメニューみたいなものが表示されるので、『除去/削除』→『重複行を単一化』を選択。

例では2行あった『納豆』が1行のみになります。

目的の形になったので以上で処理はおしまい。

その他所感

最初の方にも書いたけど今回抽出したかったはIPアドレス。正規表現でIPアドレスを検索する方法はなんとなく把握してる。

検索はできるんだけどIPアドレス以外の部分を削除してIPアドレスだけを残す方法がわからない。なんかこう、サクッとできる方法はないもんか。

諸々含めてたぶんサクラエディタとかの方が簡単にできるんだろうけど、テキストエディタとしてはMeryの方が好き。Meryでなんとかしたい。

-Windows, 備忘録
-, ,

執筆者:


  1. 大石剛司 より:

    Meryの調査をしていたら、ここを見つけました。

    マクロの勉強中ですが、以下で実現できましたので、報告させていただきます。
    マクロライブラリにある「このファイルから検索(マッチする行)」をダウンロード
    して変更しました。

    よろしくお願いします。

    // —————————————————————————–
    // このファイルから検索(マッチする行)
    //
    // Copyright (c) Kuro. All Rights Reserved.
    // www: https://www.haijin-boys.com/
    // —————————————————————————–

    //この範囲をコメントにした
    //——
    //var s = prompt(“検索”, “”);
    //if (s == “”)
    // Quit();
    //——

    //この範囲を追加した
    //——
    var s = “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+”;
    //——

    var r = new RegExp(s, “i”);
    var s1 = “”;
    if (document.selection.Text == “”)
    document.selection.SelectAll();
    var s1 = document.selection.Text.split(“\n”);
    var s2 = new Array();
    for (var i = 0; i < s1.length; i++) {
    var s3 = r.exec(s1[i]);
    if (s3)

    //この範囲を追加した
    //オリジナルは検索結果があれば、行を配列に追加している
    //s3 には検索結果が入っているので、そのまま配列に追加している
    //——
    s2.push(s3);
    //——

    //この範囲をコメントにした
    //——
    // s2.push(s1[i]);
    //——
    }
    document.selection.Text = s2.join("\n");
    document.selection.StartOfDocument();

    //以下のデータで確認しました
    //——
    //qqq
    //aaa 192.168.1.1
    //zzz
    //bb [192.168.1.2] aaa
    //aaa
    //
    //191.168.1.3
    //
    //zzz
    //——

  2. 大石剛司 より:

    Meryの調査を行っていて、ここに来ました。
    2週間前から使いはじめて、マクロの勉強中ですが
    マクロライブラリにある「このファイルから検索(マッチする行)」を
    変更すれば可能みたいです。

    1:以下をコメントにしました
    //var s = prompt(“検索”, “”);
    //if (s == “”)
    // Quit();

    2:以下を追加しました
    var s = “[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+”;

    3:以下を変更しました
    s2.push(s1[i]);

    s2.push(s3);

    よろしくお願いします。

    • pageru より:

      早速試してみたところ、問題なくIPアドレスだけを抽出することができました。
      繰り返し行う作業なので時間を短縮できて助かります。
      ありがとうございます!

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

関連記事

【備忘録】『MW WP Form』の『日付ピッカー』で生年月日の入力欄を作成する

タイトルのとおり、WordPressのフォーム作成プラグイン『MW WP Form』を使って生年月日の入力欄を作成する方法のメモです。 『MW WP Form』公式サイト より MW WP Formは …

Visual Studio Code

Visual Studio Codeにインストールしている拡張機能

極々たまにWeb制作の仕事をしております。 エディタはここ1年ちょっとぐらい『Atom』を使用していましたが、興味本位でインストールした『Visual Studio Code』に心を奪われかけています …

さくらインターネットのレンタルサーバで初期ドメインでのウェブアクセスを拒否する

仕事で対応が必要だったので実践したことをメモ。 やりたいこと 記事のタイトルどおりですが『独自ドメインを設定したさくらインターネットのレンタルサーバで、初期ドメインでのウェブアクセスを拒否したい』です …

ASUS Eee PC 1215B

ASUS Eee PC 1215BにWindows 10 Insider Previewをインストールしてみました

2011年に購入したノートPC『ASUS EeePC 1215B』にWindows 10 Insider Previewをインストールしてみたので、動作状況などを書いておきたいと思います。正式リリース …

スタンダードプランからスタンダードプランへ。速くなったさくらインターネットの新レンタルサーバに引っ越してみました。

2006年から12年もやってるのに記事が150件ちょっとしか投稿されていないこちらのしょーもないブログ『タイトルが決められない。(仮)』。開設時よりサーバはさくらインターネットのレンタルサーバ スタン …

pageruといいます。
栃木県某町在住、1980年生まれのサラリーマン。
2男児(小学生と幼稚園児)の父。
写真・ゲーム・特撮が好きですが、残念ながら全部浅いです。