2000-01-01から1年間の記事一覧

ファイルが存在するかチェックする

File.exist?(path) # ファイルがあれば真を返す File.file?(path) # 通常のファイルならば真を返す File.directory?(path) # ディレクトリなら真を返す

ファイル名をその構成要素に分割する

p File.basename("foo/bar.c") #=> "bar.c" p File.basename("foo/bar.c", ".*") #=> "bar" p File.extname("foo/bar.c") #=> ".c" p File.dirname("foo/bar.c") #=> "foo" こんな便利なものがあったとは.いままで,こんな感じのコードをわざわざ書いていた…

ファイルをリネームする

File.rename( oldname, newname)

ディレクトリとその中身を削除する

require "FileUtils" FileUtils.rmdir( path) FileUtils.rm_rf( "no_empty_dir") # ディレクトリの中身毎削除する

パターンにマッチするファイルを操作する

ディレクトリ内のすべてのファイルを処理する Dir.glob("*.*") {|f| p f} \0で区切ることで複数のパターンを指定できる Dir.glob("f*\0b*")で,fかbで始まるファイルを検索する. dosのワイルドカードよりも柔軟な指定が可能. Dir.glob("[A-C]*")でaからcで…

ファイルをコピーまたは移動する

ベタに src = open('test1.txt') dst = open('test2.txt', 'w'); dst.write( src.read) dst.close src.close require "FileUtils" FileUtils.cp('test1.txt', 'test2.txt') # コピー 第二引数にはディレクトリを指定してもよい. FileUtils.mv('test1.txt', …

ファイルを削除する

require "FileUtils" FileUtils.rm('test.txt') FileUtils.rm('NotExistFile', {:force => true}) :force => true を指定すると,エラーが出ても例外を出さない.File.delete(ファイル名)で普通に削除できる.

備忘録目次 - ロバの耳

タイムスタンプを取得/設定する

fname = "test.txt" s = File.stat(fname) p s.atime# 最終アクセス時刻 p s.mtime# 最終更新時刻 p File.atime(fname).strftime("%Y/%m/%d %H:%M:%S") p File.mtime(fname).strftime("%Y/%m/%d %H:%M:%S") # 今日の日付に変更する at = Time.now mt = Time.…

バイナリファイルから文字列を読み取る

a = File.open('xxx.jpg').binmode.read() p a.scan(/(\w{4,})\0/) # 4文字未満はゴミとして捨てる

ランダムアクセスI/Oを使用する

IO#seek(offset,whence=IO::SEEK_SET) IO::SEEK_SET ファイルの先頭から IO::SEEK_CUR 現在のファイルポインタから IO::SEEK_END ファイルの末尾から 失敗した場合は例外が発生する

備忘録目次 - ロバの耳

ファイルを行単位で逆向きに読む

a = open('test.txt').readlines() # 全部の行を読む a.reverse.each {|x| p x.chomp} # 逆順に表示 eachを逆順に実行するメソッドがあればいいのに. class Array def reverse_each (self.size-1).downto(0) {|i| yield self[i] } end end a = open('test.t…

ファイル内のすべての単語を処理する

普通に処理 open('test.txt').each {|x| x.split().each {|y| p y} } バカの一つ覚えのようにread open('test.txt').read().split(/\s+/).each {|x| p x }

ファイルの行数をカウントする

# 何行あるか? count = 0 open('test.txt').each {|x| count += 1} p count # 何個の\nがあるか数える. a = open('test.txt').read() p a.count("\n")

継続文字のある行を読む

手続き的なコード prev = '' open('test.txt').each {|x| x.chomp! if x[-1]!=?\\ p prev+x prev = '' else prev += x.chop end } p prev if prev.size>0 かっこ悪い… こっちのほうがマシ? a = open('test.txt').read() p a.gsub(/\\\n/, '').split("\n") …

備忘録目次 - ロバの耳

読み取るバイト数を指定する

IO#read([length]) でバイト数を指定できる f = open('test.txt') p f.read(3) # 3バイト読む p f.read(1) f.close

出力をフラッシュする

IO#flush IO#fsync flushはアプリレベルで,fsyncはOSレベル?使わなそう.c/c++でなら,実行時間が長いアプリで途中結果を横から覗き込みたい.ハングしても途中結果は吐き出させたいというときに使うけど.

一時ファイルを使ってファイルを更新する

srcname = 'old.txt' tmpname = 'old.tmp' bakname = 'old.bak' dst = open( tmpname, 'w') # テンポラリ src = open( srcname) src.each {|x| # ここでxを加工する dst.puts x.downcase } src.close() dst.close() File.rename( srcname, bakname) # すでに…

フィルタを書く

$stdin.each {|l| puts l.chomp.downcase } 標準入力から受け取って小文字にして出力する.

一時ファイルを作成する

require 'tempfile' temp = Tempfile::new("foobar", "/home/tmp")未調査

標準エラー出力の先を変更

ferr = open("error.log", "a") # 追記モードで開く $stderr = ferr # 標準エラー出力を変更 $stderr.puts 'an error occurred!!!' # エラーの吐き出し $stderr = STDERR # 元に戻す ferr.close # 閉じる 直接 $stderrに代入して,閉じるのもrubyに任せる? …

備忘録目次 - ロバの耳

ファイルをオープンする

f = open('test.txt') # ファイルをオープン f.close # ファイルを閉じる # open('test.txt','w') # 書き込みモードでファイルをオープン open('test.txt') {|f| } # ファイルは自動で閉じられる begin f = open('test_.txt') f.close rescue => err if err.…

備忘録目次 - ロバの耳

文字列パターン内で,AND,ORを表現する

/re1|re2/ # re1かre2が含まれる文字列 /re1.*re2|re2.*re1/ # re1とre2が重複せずに両方含む文字列

連続する単語

re = /(foo|bar)\1/ p 'foofoo' =~ re #=> 0 p 'foobar' =~ re #=> nil p 'barfoo' =~ re #=> nil p 'barbar' =~ re #=> 0 re = /(foo|bar)(?!\1)(foo|bar)/ p 'foofoo' =~ re #=> nil p 'foobar' =~ re #=> 0 p 'barfoo' =~ re #=> 0 p 'barbar' =~ re #=> …

欲張りマッチと非欲張りマッチ

str = "<b>foo</b> <strike>bar</strike>" p str.gsub(/<.*>/, '') #=> "" p str.gsub(/<.*?>/, '') #=> "foo bar" {m} m回 {m,} m回以上 {m,n} m回以上,n回まで

ワイルドカードを正規表現にする

def wild_to_re( pat) Regexp.new( "\\A"+pat.gsub(/\./,'\\.').gsub(/\*/,'.*').gsub(/\?/,'.')+"\\z") end p wild_to_re( '*.*') #=> /\A.*\..*\z/ p wild_to_re( 'log????.txt') #=> /\Alog....\.txt\z/ これはライブラリの中をあされば,似たようなコー…