[ruby-list:49310] Re: ファイルアクセス処理に関して
From:
HIDE <u-zero@...>
Date:
2013-04-06 07:42:17 UTC
List:
ruby-list #49310
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