一定間隔でのテキストの抜き出しNo.35887
Melia さん 17/07/09 01:46
 
秀丸エディタ、いつも便利使わせてもらっています。

あるテキストファイルから、一定間隔で行を抜き出したいのですが、grepの正規表現
で対応できますでしょうか?例えば100行目毎に次のような行からなるファイルを出
力するというイメージです。

元ファイル.txt001行目: 001行目の内容
元ファイル.txt201行目: 201行目の内容
元ファイル.txt301行目: 301行目の内容
元ファイル.txt401行目: 401行目の内容
元ファイル.txt501行目: 501行目の内容


よろしくご教示お願いします。

[ ]
RE:35887 一定間隔でのテキストの抜き出しNo.35888
IKKI さん 17/07/09 02:47
 
こんばんは。ユーザーの IKKI と申します。

>一定間隔で行を抜き出したいのですが、grepの正規表現で対応できますでしょうか?
grepで行番号を検索条件とすることはできません。

> 例えば100行目毎に次のような行からなるファイルを出力するというイメージです。
これだけでしたら次のマクロでできますが、いかがでしょう。

$output_filename = "100th.txt";
disabledraw;
##fso = createobject("Scripting.FileSystemObject");
##f = callmethod_returnobj(##fso, "OpenTextFile", $output_filename, 2, 1, -
1); // Unicode
// ##f = callmethod_returnobj(##fso, "OpenTextFile", $output_filename, 2,
1); // ASCII
gofiletop;
while (lineno < linecount2) {
 if (lineno % 100 == 1) {
  callmethod ##f, "Write", gettext2(0, lineno, 0, lineno + 1);
 }
 moveto2 0, lineno + 1;
}
callmethod ##f, "Close";
releaseobject ##fso;
enabledraw;

もしどうしても秀丸の grep 機能を使いたいということでしたら、
 1. 全行の行頭に行番号を追加しておく
 2. 「^\d*01\y」で grep
 3. 行頭の数字を削除
みたいな手順になるかと思います。

秀丸エディタ v8.73β11

[ ]
RE:35888 一定間隔でのテキストの抜き出しNo.35897
Melia さん 17/07/11 18:02
 
IKKIさん、

早速ありがとうございます。
マクロの方は、文法エラーまたはこのバージョンでは実行不可というメッセージが出
てしまったのですが(最初に書いておくべきでしたがVMware
Fusion/MacでWin7+秀丸エディタ8.12という環境をメインに使っています)、
grepの方で100万行強のサンプルを試してみても短時間で処理できました。

大変助かりました、ありがとうございます。

Melia

2017-07-09 2:47 GMT+09:00 IKKI <xxxxxxxxxxxxxxxxxxx@maruo.co.jp>:

> こんばんは。ユーザーの IKKI と申します。
>
> >一定間隔で行を抜き出したいのですが、grepの正規表現で対応できますでしょうか?
> grepで行番号を検索条件とすることはできません。
>
> > 例えば100行目毎に次のような行からなるファイルを出力するというイメージです。
> これだけでしたら次のマクロでできますが、いかがでしょう。
>
> $output_filename = "100th.txt";
> disabledraw;
> ##fso = createobject("Scripting.FileSystemObject");
> ##f = callmethod_returnobj(##fso, "OpenTextFile", $output_filename, 2, 1, -
> 1); // Unicode
> // ##f = callmethod_returnobj(##fso, "OpenTextFile", $output_filename, 2,
> 1); // ASCII
> gofiletop;
> while (lineno < linecount2) {
>  if (lineno % 100 == 1) {
>   callmethod ##f, "Write", gettext2(0, lineno, 0, lineno + 1);
>  }
>  moveto2 0, lineno + 1;
> }
> callmethod ##f, "Close";
> releaseobject ##fso;
> enabledraw;
>
> もしどうしても秀丸の grep 機能を使いたいということでしたら、
> 1. 全行の行頭に行番号を追加しておく
> 2. 「^\d*01\y」で grep
> 3. 行頭の数字を削除
> みたいな手順になるかと思います。
>
> 秀丸エディタ v8.73β11
>


---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:35897 一定間隔でのテキストの抜き出しNo.35898
IKKI さん 17/07/11 22:29
 
Meliaさん、こんばんは。

> VMwareFusion/MacでWin7+秀丸エディタ8.12という環境をメインに使っています
Macでしたか!!!!!
Macでしたら、そもそも秀丸エディタなど使わずとも、Macのターミナルを開いて

$ awk 'FNR%100==1 {printf "%d: %s\n", FNR, $0;}' < 入力ファイル.txt > 出力フ
ァイル.txt

とすればお望みの結果が得られます。
7年前のMac Miniで試したところ、100万行 (101MB) のファイルが12秒で処理されま
した。

>マクロの方は、文法エラーまたはこのバージョンでは実行不可というメッセージが
>出てしまった
あのマクロは秀丸エディタ v8.12 でも動くと思いますが、 VMware のせいで何か違
うことがあるのかもしれません?

[ ]
RE:35898 一定間隔でのテキストの抜き出しNo.35899
Melia さん 17/07/12 02:56
 
IKKIさん、再びご教示いただきありがとうございます。

Macを使って長いのですが、ターミナルを使わず通常のアプリを使うことの多い
万年初心者です。職場では秀丸も入っているWindowsになっているというのも
一つの理由(言い訳w)なのですが。

秀丸でマクロ、grep、ターミナルでawkとオプションを教えていただいただけ
でも有り難いです!

[ ]