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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

1560閲覧

rubyを用いてテキストファイルの前方および後方部分を削除する方法

sakuya_izayoi

総合スコア19

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

1クリップ

投稿2017/04/04 06:30

rubyを用いてテキストファイルの前方および後方部分を削除する方法を知りたいです。
現在、実験結果出力ファイルにて必要となる記載がある部分がファイルの中央付近にあり、いつも決まった行から決まった行まで、たとえば1万行あれば、2500行目から5000行目にしかほしい記載がないとします。
2500行目から5000行目のみを取り出すようなプログラムはrubyで書こうと思って書いたのですが、
前方2499行カットや後方をカットするようなコードはかけたのですが、両方を同時に処理する方法が分からず、投稿させていただきました。

現在のコードを記載します。

ruby

1ruby -e '2499.times{gets};puts ARGF.read' 00001.txt>00001ヘッダー削除.out 2

上記のですと、前方部分2499行までがカットされた状態ですので、最初のカットされていないときよりは作業が楽なのですが、欲を言うと、後方も削除できたらいいなと思っております。

前後ともに同時にカットして出力する方法はないものでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答4

0

どうしてもRubyでということなら、
1.ファイルがメモリに全部入りきる場合

Bash

1ruby -e "puts ARGF.readlines[2499..4999]"

2.ファイルがメモリに全部入りきらない場合

Bash

1ruby -e "5000.times{|n| x=ARGF.gets;puts x if n>=2499}"

投稿2017/04/04 14:21

編集2017/04/04 15:14
otn

総合スコア84538

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

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

sakuya_izayoi

2017/04/04 14:47

otn様 すみませんが使い方としてはどのようになっているのでしょうか?上記両方とも、テキストエディタにコピーして、.batとして保存し実行しようとしたのですが、どこの段階で入力ファイルと出力ファイルを記載すればよいのでしょうか? よろしくお願いします。
otn

2017/04/04 15:15

そこからですか! ruby -e "~~" 入力ファイル名 >出力ファイル名 です。 質問文にそうお書きなので、てっきり理解して書いている物かと思っていました。
sakuya_izayoi

2017/04/04 22:47

ごめんなさい。こちらの勘違いで、自分で.batで保存してと書いているにもかかわらず、.rbで保存して、コマンドプロンプロからruby a.rbと起動させていました。申し訳ない。
guest

0

参考情報

  • Windows標準コマンドでheadやtailする

https://tech-mmmm.blogspot.jp/2016/01/windowsheadtail.html

...
中間を取り出したい場合は、2通り方法がある
...
firstとlastを組み合わせる
...
skipを使う
...

  • サイズの大きいcsvファイルから先頭・末尾を取得するときのメモ

http://noterr0001.hateblo.jp/entry/20150719/1437288892

投稿2017/04/04 13:05

katoy

総合スコア22324

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

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

sakuya_izayoi

2017/04/04 15:01

powershellという方法は初めて知りました。これでテキストファイルに出力できれば良いのですが・・・。firstで末尾部分をしていして、lastでそこから戻す行数って感じですか。慣れないと難しいですね。
guest

0

ベストアンサー

ruby -e 'puts ARGF.read.split("\n")[2499..4999]' 00001.txt > 00001結果.out
でイケルと思います。

投稿2017/04/04 07:47

raa0121

総合スコア190

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

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

sakuya_izayoi

2017/04/04 08:42

ありがとうございます。ばっちりです。テキストファイルの一列目はrubyだとゼロ列目扱いになる、でいいのですよね? read.splitまではわかるのですが、("\n")は何を表しているのですか?
raa0121

2017/04/04 08:49

> テキストファイルの一列目はrubyだとゼロ列目扱いになる はい、そうなります。 > read.splitまではわかるのですが、("\n")は何を表しているのですか? "もじれつ\nもじれつ".split("\n") は改行コードLFでファイルを分割するということになります。 もしファイルが、Windows のもので、CR+LF になっているなら、split("\r\n") にしたほうが良いと思います。
guest

0

ワンライナー実行という状況を踏まえて、どうしてもRubyでないといけないのでなければ、sedが手っ取り早いです。

$ sed -n -e '2500,5000p' filename

-nで自動出力を止めて、指定の行数だけ出力しています。

投稿2017/04/04 06:38

編集2017/04/04 06:39
maisumakun

総合スコア145183

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

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

sakuya_izayoi

2017/04/04 07:00

ベースがwindowでありまして、プログラムを他にインストールが出来ないようになっております。 OSを記載しておけばよかったです。申し訳ありません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問