[ruby-list:49311] Re: ファイルアクセス処理に関して

From: Daisuke Yokotsuka <yokots_d@...3-net.ne.jp>
Date: 2013-04-07 00:32:41 UTC
List: ruby-list #49311
こんにちは、横塚です。
私もrubyを初めてから4ヶ月の初心者ですが、こんな感じでどうでしょうか。

一応テスト済みです。

#!/usr/bin/ruby -Ks 
# encoding : Windows-31J
# 上記のエンコーディングはあなたの環境に合わせて適宜書き換えて下さい。

FOLDER ="c:\\temp\\" ; 		# 目的のフォルダ名
PATTERN = "abc.*" ; 		# ファイル名とパターンマッチさせる正規表現
NEW_EXTENTION = ".foo" ;	# 新しい拡張子
FIXED_STRING = "varvar" ; 	# 先頭行に追加する文字列

dir = Dir.open(FOLDER) ;
while filename = dir.read do 						# フォルダの中のファイル名を取得する
	fullpath = FOLDER + filename ;					# フルパスの作成 
	if FileTest.file?(fullpath) and (/^#{PATTERN}/ =~ filename) then 
		# パターンとマッチした名前のファイルなら、以下の処理をする
		filebody = fullpath.gsub(/\..*$/, "") ;		# 拡張子を除いたファイル名の取得
		new_filename = filebody + NEW_EXTENTION ; 	# 新しい拡張子をつけたファイル名の作成
		contents = IO.readlines(fullpath) ; 		# ファイルの読み込み
		if contents[0] == nil then 					# 空ファイルが存在した場合の用心	
			contents[0] = "\n" ; 
		end 
		output = open(new_filename, "w") ; 			# 新しいファイルをオープン
		contents[0] = FIXED_STRING + contents[0] ; 	# 先頭行の先頭に固定の文字列を挿入
		contents.each do | line | 					# 新しいファイルの書き込み
			output.write(line) ; 
		end
		output.close ; 
	end 
end
dir.close

XXX if xxxx とか XXXX {   }を使えばもっと短いコードになるのですが、
上記のやや冗長なコードは私の趣味です。
多少長くても、後で読みやすい、他人が読みやすいコードを心がけてます。




<20130406154514.433A.U-ZERO@grape.plala.or.jp> の、
   "[ruby-list:49310] Re: ファイルアクセス処理に関して" において、
   "HIDE <u-zero@grape.plala.or.jp>"さんは書きました:

> Hiroさん
> 
> ご丁寧なご回答ありがとうございます。はじめまして、臼井です。
> ほぼイメージ通りかと思っております。
> 
> ただ、やりたい事がバラバラでわかりずらかったかと感じたので、
> もう少し簡潔に書いてみました。
> 
> 1.まず、あるディレクトリ内に存在する同一拡張子のファイルの中から
>  正規表現等?でパターンマッチさせ特定のファイルを見つけます。
> 2.見つけだした既存ファイルの内容で新たにファイルを新規作成します。
> 3.ここで、新規作成したファイル名は、見つけ出したファイル名を引き継ぎ、
>  拡張子のみ変更します。
> 4.最後に、再度新規作成したファイルをオープンし、ファイル一行目の
>  先頭位置に固定の文字列等の情報を付加して、ファイルをクローズして
>  終了です。
> 
> 一応、狙い動作としては、一連の1.〜4.の振る舞いを一回で実行したいです。
> 改めてご提案していただいた方法の組み合わせで問題ないでしょうか?
> 
> 以上、よろしくお願いします。
> 
> //うすい
> 
> On Sat, 6 Apr 2013 04:53:02 +0900
> "H.Hiro" <main@hhiro.net> wrote
> 
> > H.Hiroです。
> > 
> > [その1]
> > 
> > 「ファイル名でパターンパッチさせ文字列を読み込み」というのはどういうことでしょうか?いくつかの
解釈のもとに書いてみます。
> > 
> > <解釈1:指定したファイル名のファイルが存在するならばそれを返す>
> > 
> > filename = "1.txt"
> > filename = nil unless File.exist?(filename)
> > # もし1.txtが存在すれば、filenameは「1.txt」となる。
> > # もし1.txtが存在しなければ、filenameはnilとなる。
> > 
> > <解釈2:指定ディレクトリのファイル名一覧を取得し、それを特定の条件のもとで抽出する>
> > 
> > dir = "./hoge"
> > result = Dir.entries(dir).select{ |filename| filename =~ /\.txt$/ } #
> > 一旦ディレクトリの内容全体を取得する場合
> > # あるいは
> > result = Dir.glob("hoge/*.txt") # 条件を指定するのにワイルドカードさえあればよい場合
> > 
> > [その2]
> > 
> > ファイルを開くだけであれば、拡張子を分割する必要はない(上記[その1]では、拡張子を含んだファイ
ル名が得られるため)ですが、もし「拡張子を除いたファイル名を取得しておく必要がある」ということなら
ば、以下の方法でできます。
> > 
> > fname_all = "./hoge/piyo/sample.txt"
> > fname_base = File.basename(fname_all) # ディレクトリ名を除去。
> > 
> > # 拡張子(ドット込み)をfname_extに、拡張子以外の部分をfname_bodyに格納
> > pos = fname_base.rindex(".")
> > if pos
> >   fname_body = fname_base[0, pos]
> >   fname_ext = fname_base[pos..-1]
> > else
> >   fname_body = fname_base
> >   fname_ext = ""
> > end
> > 
> > [その3]
> > 
> > ファイルの内容の読み込みは IO.read(filename)
> > でできます。極端に大きいファイルでなければこれでよいです(IO.readはファイル全体を読み込むので)
。
> > 
> > 書き込み(ファイル名 filename の内容を、文字列 str で置き換える)は以下のようになります。
> > 
> > open(filename, "w"){ |f| f.print str }
> > 
> > [その4]
> > 
> > ファイルの末尾への追加は別な方法でできますが、先頭となると、一旦ファイルから読み込んで変数に格
納し、その内容を操作してから、一から書き込むことになります。
> > 
> > str = IO.read(filename)
> > str = "010203040506070809A0B0C0D0E0F0" + str
> > open(filename, "w"){ |f| f.print str }
> > 
> > 2013年4月5日 23:25 HIDE <u-zero@grape.plala.or.jp>:
> > > いつもお世話になっております。臼井@ruby初心者と申します。
> > >
> > > rubyを使用して簡単なファイルアクセスを処理を行いたいのですが
> > > うまくイメージ通りにいきません。
> > >
> > > どなたか、ご教授いただけませんでしょうか?
> > > できれば、サンプルスクリプト等、ご提供いただけると助かります。
> > >
> > > 以下4点、やりたいことまとめてみました。
> > >
> > >         ###その1###
> > >         ある任意のディレクトリから特定の既存ファイル名を文字列として読み込みしたい!!!(一時保
存)
> > >         <イメージ>
> > >      以下のディレクトリ内を検索して"natsume010102.mot"というファイル名で
> > >      パターンパッチさせ文字列を読み込み
> > >
> > >      fxatX0092@fxatX0092-01 /cygdrive/d/file
> > >       $ ls -ltr
> > >              -rwx------+ 1 fxatX0092 mkpasswd 200354 2013-03-25 18:07 natsumexx0002.mot*
> > >              -rwx------+ 1 fxatX0092 mkpasswd 200354 2013-03-25 18:07 natsume010102.mot*
> > >              -rwx------+ 1 fxatX0092 mkpasswd 200354 2013-03-25 18:07 natsume010101.mot*
> > >              -rwx------+ 1 fxatX0092 mkpasswd 200354 2013-03-25 18:07 natsume.mot*
> > >
> > >            fname = "natsume010102.mot"  #ファイル名文字列取得
> > >
> > >         ###その2###
> > >         取得した文字列で新規ファイル(?????????.iot)でオープンしたい!!!
> > >         <イメージ>
> > >          fname ="natsume010102."  #拡張子を除く文字列取得->その1で取得した文字列
> > >          fname2 ="iot"            #新しい拡張子の文字列取得
> > >          fname3                   #fnameとfname2の文字列連結
> > >          f = open(fname3,"r+b")   #ファイルOPEN
> > >
> > >         ###その3###
> > >         既存のnatsume010102.motファイルの中味を新ファイルへ読み込み&書込みしたい!!!
> > >         <イメージ>
> > >          [natsume010102.motの中]
> > >          header
> > >          aabbccddeeffgghh
> > >          aabbccddeeffgghh
> > >          xxxxxxxxxxxxxxxx
> > >          yyyyyyyyyyyyyyyy
> > >          zzzzzzzzzzzzzzzz
> > >
> > >          [natsume010102.iot(新ファイル)の中]
> > >          header
> > >          aabbccddeeffgghh
> > >          aabbccddeeffgghh
> > >          xxxxxxxxxxxxxxxx
> > >          yyyyyyyyyyyyyyyy
> > >          zzzzzzzzzzzzzzzz
> > >
> > >         ###その4###
> > >         ファイル先頭位置から任意の固定文字列挿入したい!!!
> > >         <イメージ>
> > >         [natsume010102.iotの中]
> > >         010203040506070809A0B0C0D0E0F0header
> > >         aabbccddeeffgghh
> > >         aabbccddeeffgghh
> > >         xxxxxxxxxxxxxxxx
> > >         yyyyyyyyyyyyyyyy
> > >         zzzzzzzzzzzzzzzz
> > >
> > > 以上、よろしくお願いいたします。
> > >
> > > //うすい
> > >
> > >
> > 
> > -- 
> > H.Hiro / Maraigue
> > http://hhiro.net/about/
> > main@hhiro.net
> 
> 
> 
> 
> 


--
Daisuke Yokotsuka

In This Thread

Prev Next