お世話になります。
rubyを用いた、フォルダ内にある拡張子.outファイルに対して同じ処理を次々にやってもらうという方法を知りたいです。
現在回しているプログラムを提示いたします。
現在のところ
_________________ここから
# encoding: shift_JIS
FILE_NAME = 'data2.out'
OUT_COL_NAMES = 'ID,合成,X,Y,Z,鉛直応力,水平応力' #元ファイル一列目にヘッダーがあるとき用
def calc(line)
id, x, y, z, 鉛直応力, 水平応力 = line.gsub(',', ' ').split.map { |s| s.to_f }
[id.to_i, Math.sqrt(x * x + y * y + z * z) * 100 , x * 100 , y * 100 , z * 100 , 鉛直応力 * 1000 , 水平応力 * 1000] #合成加速度および単位変換
end
File.open(FILE_NAME, 'r'){|f|
File.open('convert_data2.inp', "w"){|xf|
f.each_line.with_index { |line, idx|
out_line = # 元ファイルにヘッダーがあるときは、コメントアウト解除 idx.zero? ? OUT_COL_NAMES : \
('%d'+' %10.9E' * 6)%calc(line)
xf.puts out_line
} } }
________________ここまで
上記計算式を使う場合には、今現在
FILE_NAME = 'data2.out'
File.open('convert_data2.inp', "w"){|xf|
の部分に手打ちで入力用のファイル名である
FILE_NAME =' '
と出力用のファイル名である
File.open(' ', "w"){|xf|
に手入力で「data2.out」や「convert_data2.inp」と入力しております。
入力ファイルの頭は必ずdata2.outから始まって、最後は不定です。data100.outで終わることもあればdata250.outで終わることもあるといった感じです。
お聞きしたいことは
data2.out
data3.out
・・・
data100.out
とフォルダ内に入っていたらdata~.outを次々に読み込んで
convert_data2.inp
convert_data3.inp
・・・
convert_data100.inp
のようにconvert_data~.inpファイルを作っていく方法です。
ファイルは連番なので変数にすれば良いのかと思って
dataのあとの数字をtimesやeach関数を使えばいいのかと思ったのですが、ことごとく全滅してしまいました。
どのようにしたら次々にファイルを読み込んでくれるのでしょうか。お力をお貸しください。
No.1ベストアンサー
- 回答日時:
以下のようにしてください。
#修正開始 から
#修正終了 までがこちらで修正した箇所です。
FILE_NAME をオープンして、convert_data2.inpへ出力する箇所をmainのメソッドにしました。
mainに引数としてファイル名を渡します。("data2.out"等に相当)
そのファイルを入力用にオープンし、そのファイル名から出力用ファイル名を作成しています。(convert_data2.inp等に相当)
mainの呼び出し側は、当該ディレクトリ下に存在する "data*.out"に該当するファイルの一覧を取得し、
その一覧のファイルを1個ずつmainに渡しています。
このスクリプトは、"data*.out"が存在するディレクトリと同じディレクトリに置いてから呼び出してください。
-------------------------------------
# encoding: shift_JIS
FILE_NAME = 'data2.out'
OUT_COL_NAMES = 'ID,合成,X,Y,Z,鉛直応力,水平応力' #元ファイル一列目にヘッダーがあるとき用
def calc(line)
id, x, y, z, 鉛直応力, 水平応力 = line.gsub(',', ' ').split.map { |s| s.to_f }
[id.to_i, Math.sqrt(x * x + y * y + z * z) * 100 , x * 100 , y * 100 , z * 100 , 鉛直応力 * 1000 , 水平応力 * 1000] #合成加速度および単位変換
end
#修正開始
def main(file_name)
outfile_name = 'convert_' + file_name
outfile_name = outfile_name.sub(/\.out/i,".inp")
File.open(file_name, 'r'){|f|
File.open(outfile_name, "w"){|xf|
f.each_line.with_index { |line, idx|
out_line = # 元ファイルにヘッダーがあるときは、コメントアウト解除 idx.zero? ? OUT_COL_NAMES : \
('%d'+' %10.9E' * 6)%calc(line)
xf.puts out_line
} } }
end
files = Dir.glob("data*.out",File::FNM_CASEFOLD)
files.each do |file|
main(file)
end
#修正終了
-----------------------------------------
tatsu99様
ありがとうございます。思った通り回ってくれています。
____________
# encoding: shift_JIS
FILE_NAME = 'data2.out' #この部分は関係なくなっているのですよね?
______________
フォルダ内にあるdata*.outを読み込む部分は
-----------------------------------------
files = Dir.glob("data*.out",File::FNM_CASEFOLD)
files.each do |file|
main(file)
end
#修正終了
-----------------------------------------
の部分で読み込んでくれていると思うのですが、この読み込んだファイルに対して、なんで私の最初入れていた数式を適用してくれるのだろうという不思議な部分があります。
というのも、どのファイルに対して適用しろという指示なしに動いちゃっているように思えたからです。
私の場合は
FILE_NAME = 'data2.out'
という感じで、フォルダ内のファイルを指定していました。ここからファイルをメモリー上に読み込んで計算処理をさせていたつもりです。
tatsu99様が作ってくださった方法ですと、ファイルを直接指定していないけど、data*.outというファイルを順番通りにメモリーに展開して、それに対して毎回計算させて、結果ファイルをconvert_data*.inpに出力という感じなのでしょうか?
No.2
- 回答日時:
>FILE_NAME = 'data2.out' #この部分は関係なくなっているのですよね?
はい。使っていません。この行はなくても構いません。
>tatsu99様が作ってくださった方法ですと、ファイルを直接指定していないけど、data*.outというファイルを順番通りにメモリーに展開して、
>それに対して毎回計算させて、結果ファイルをconvert_data*.inpに出力という感じなのでしょうか?
はい。Dir.glob("data*.out",File::FNM_CASEFOLD)で、該当ファイルの一覧が取得できます。
data2.out
data3.out
などです。
フォルダ内の
data2.out
data3.out
・・・
data100.out
を順番に処理させるため、そのようにしました。
又、元のソースを極力生かすようにしました。
files = Dir.glob("data*.out",File::FNM_CASEFOLD)
files.each do |file|
main(file)
end
のかわりに
main("data2.out")
main("data3.out")
・・・
main("data100.out")
としても、同じ結果が得られます。
ありがとうございます。同じ結果になるという部分みて合点がいきました。その処理が行われているんだって分かりやすかったです。
元の記述も気にしていただき感謝します。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- その他(プログラミング・Web制作) Fortranでの出力ファイル 2 2023/03/21 21:25
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- C言語・C++・C# pythonのファイルの並びでの読み込みとリストについて 4 2022/04/13 03:52
- その他(プログラミング・Web制作) pythonのこのエラーがわかりません 3 2022/11/16 14:54
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Excel(エクセル) SUMIFSと日付変換 10 2023/04/16 15:38
- C言語・C++・C# 10個の実数に対する降順ソート結果を出力するプログラムを作りたいのですが、以下のプログラムをどう直せ 1 2022/07/09 22:16
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
- Windows 10 EFS(内容を暗号化してデータをセキュリティで保護する)はHomeエディションでは使えませんか??? 1 2023/05/20 18:16
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【ruby】flockで掛けたロックを...
-
ギャスケット作成。修正の解説...
-
fortranでNAのあるデータを読み...
-
Fortran:列数の分からないデー...
-
VBAでcsvファイルもシートもあ...
-
EXCEL→CSV保存時のダブルクォー...
-
バッチ処理 特定の文字以降を...
-
ダブルコーテーション付きでCSV...
-
C# ファイルを読み込みlistvie...
-
【ExcelVBA】300万件越えCSVか...
-
VBA テキストボックスを選択状...
-
Excelマクロ 空白セルを無視し...
-
バッチ for /f 空白、スペース...
-
verilog HDLについての質問です...
-
VBA csvファイルのデータを...
-
VB.netでShellExecuteがしたい
-
複数のファイルをまたぐエクセ...
-
SQLでテキストボックスの文字を...
-
[コンパイルエラー 修飾子が不...
-
rubyを用いたCSVファイルの分割...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
pythonのエラーについて
-
pycharmへのpysamインストール...
-
fortranでNAのあるデータを読み...
-
Fortran:列数の分からないデー...
-
【fortran77】空行を含む数値デ...
-
区切り文字の調整方法について...
-
【ruby】flockで掛けたロックを...
-
rubyの見えない文字
-
2次元Hashのkeyチェック方法
-
Ruby 暗号化したファイルの復号...
-
ギャスケット作成。修正の解説...
-
Excelマクロ 空白セルを無視し...
-
バッチ処理 特定の文字以降を...
-
【ExcelVBA】300万件越えCSVか...
-
ダブルコーテーション付きでCSV...
-
VBAでcsvファイルもシートもあ...
-
パイソンでテキストファイルが...
-
VBA テキストボックスを選択状...
-
CSVで余計な空行が入る
-
EXCEL→CSV保存時のダブルクォー...
おすすめ情報