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

From: "H.Hiro" <main@...>
Date: 2013-04-05 19:53:02 UTC
List: ruby-list #49309
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

In This Thread