5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

テキストファイルから1行ずつ読み込む

Posted at

テキストファイルの中身を1行ずつ読み込みたいことが少なからず発生する.
今回勉強がてらに調べたため,Perl5とcshでメモとして残すことにした(未来の自分への備忘録).

cshのバージョン:tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-apple-darwin) options wide,nls,dl,al,kan,sm,rh,color,filec
※tcsh?
Perl5のバージョン:This is perl 5, version 18, subversion 2 (v5.18.2) built for darwin-thread-multi-2level
スクリーンショット 2015-12-26 17.34.47.jpg

■以下,読み込みファイル内容
ファイル名:1lineGet.txt
スクリーンショット 2015-12-26 17.42.05.jpg

※白色の文字を読み込む.他の色はエディタの機能で色づけされている.

■Perl5

Perl5で実装するのは私の完全なる自己満足なので,突っ込みがあれば教えてください.
・結論(出力結果)
スクリーンショット 2015-12-26 18.08.08.jpg
ファイル内容が表示されているのがわかると思います.

・ソースコード

1lineGet.pl
# !/usr/bin/perl
# vim:set ts=4 sts=4 sw=4 tw=0:

use 5.010;
use strict;
use warnings;

print "今からファイル内を1行ずつ読み込み,表示する.\n";

open FILE, '<', '1lineGet.txt' or die "$!";
while ( <FILE> ) {
	print;
}
close FILE;

print "END.\n";

■csh

職場で苦心した末に,スーパープログラマーにやり方を教えてもらいました.

・結論(出力結果)
スクリーンショット 2015-12-26 18.17.41.jpg
問題なく表示されているのがわかると思います.

・ソースコード

1lineGet.csh
# !/bin/csh -f
# vim:set ts=4 sts=4 sw=4 tw=0:

set FILE='1lineGet.txt'

echo "今からファイル内を1行ずつ読み込み,表示する."
set COUNT=`wc -l $FILE | awk '{print $1;}'`
@ i = 1
while ( $i <= $COUNT )
	set line="`cat $FILE | head -$i | tail -1`"
	echo "$line"
	@ i++
end
echo "END."

今回の肝は2点あり,行数にてループを制御している箇所とcatコマンドにパイプで1行読み込みが出来るように制御している箇所です.
nawkを駆使すれば同じように出来るようですが,私の技術力が無いため,上記のようになりました.
入力ファイルを確認していただければわかると思いますが,タブ・半角スペース・諸々の記号に屈すること無く,問題なく読み込めていることに感動しました.
入力ファイルの記号は以下の通りです.
>---:Tab表示
<:行末表示

2点の肝解説
1点目:行数取得後のループ制御
スクリーンショット 2015-12-26 18.31.13.jpg
wcコマンドにて入力ファイルの行数を取得し,awkコマンドにて行数部分のみを切り出しています.
入力ファイルと照らし合わせても37行存在していることがわかり,正しく取得できているのがわかります.

2点目:catコマンド
catコマンドだけの使い方では,全行取得してしまうため,パイプにてheadコマンドにて1行目を取得しています.
スクリーンショット 2015-12-26 18.34.47.jpg
入力ファイルの1行目だけを取得し続けるわけに行かないため,headコマンドへの引数をwhileでインクリメントしながら取得行数を増やしています.
このままでは1行目を37回取得することになるため,さらにtailコマンドにて最終行のみを取得するように取得内容を抑止しています.
スクリーンショット 2015-12-26 18.38.23.jpg
取得した内容を変数に入れて表示しています.

この後は,変数(ここでは$line)を加工するなり何なりでメイン処理として使用することになります.
なぜ,ここまでめんどくさいやり方を用いているかと言えば,入力ファイルの1行にタブやスペースが入力されていた場合そこで区切られて変数に格納されてしまうため,このようなやり方にたどり着きました.
※家で再現できずorz

教えていただいた使用方法とは言え,感動したためQiitaに投稿しました.
以上です.

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?