• 締切済み

rubyのデータ読み取りについて

rubyで100行からなる "山田" : 173, 60 ; 176, 61 のようなデータを読み取り、kekka_fileに書き出すとすれば、冒頭で file=open("data","r") この文を書き、この後は、どういうプログラムを組めばよいでしょうか? while文を使えばよいのでしょうか? 大雑把な質問で、すいません 回答宜しくお願いします。

  • Ruby
  • 回答数2
  • ありがとう数1

みんなの回答

  • notnot
  • ベストアンサー率47% (4851/10265)
回答No.2

初心者向きに普通に書くとすると、 open("kekka_file","w") do |outfile| IO.foreach("data") do |line| line.chomp! #改行文字の削除 lineに対しての処理 outfile.puts 処理結果 end end

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

データの解釈の仕方をエスパーしてみて、次のデータ: "山田" : 173, 60 ; 176, 61 "佐藤" : 137, 40 ; 176, 16 ――を、YAML形式で書き出す例。 http://ideone.com/3YdsK1 書き出したYAML形式のデータを読み込んで、2番目のデータを表示させた例。 http://ideone.com/iaw60O 回答が大雑把なのは、ご容赦。

関連するQ&A

  • RubyによるCSVファイルの該当行の取り出し

    お世話になります、 Rubyプログラムにて以下のようにCSVファイルをコピー&ペーストしておりますが、 出力結果の1-4行目までの数値は必要ないため、5行目より処理をしたいのです。 良い方法があればご教示いただけないでしょうか。 ・RubyProgram <snip> p1 = ARGV[0] # p1:出力ログ対象CSV file_csv = File.open(p1,"r") while csv_word = file_csv.gets do chk_value_log.print csv_word p csv_word end file_csv.close chk_value_log.close <snip> ・出力結果 $ ruby -v aaaaa.rb bbbb.csv ruby 1.8.4 (2005-12-24) [i386-cygwin] "# name, id, name, IP address,,,,,,,,,,,,,,,,,,,,\r\n" "# name, id, name, IP address,,,,,,,,,,,,,,,,,,,,\r\n" "# name, id, name, IP address,,,,,,,,,,,,,,,,,,,,\r\n" "# name, id, name, IP address,,,,,,,,,,,,,,,,,,,,\r\n" "1,3,1101,0,32,19,1152,1,4,0,0,0,0,0,0,0,0,1152,1101,51,0,0,0,0\r\n" "1,4,254,0,7,3,264,1,3,0,0,0,0,0,0,0,0,264,254,10,0,0,0,0\r\n" "1,1,-1,0,25,66,-1,0,0,0,0,0,0,0,0,0,0,0,0,-1,70,2945,8153\r\n"

  • Rubyのスクリプト

    つぎのようなスクリプトを組みました。これはこれで、動いておりますが、お願いです。 (1)Rubyらしい書き方にするには、どこを改めればよいですか? (2)ref_file=open("myReference.txt") の部分は、 外部のレファレンスを用いて名前を翻訳しているところです。 この部分を、関数呼び出しでやってしまいたい。どのように組みなおせば良いですか? 宜しくお願いいたします。 --------------------- おおまかな説明:ディレクトリ「myData」の中にあるlogファイルをひとつずつオープン。 まず、「Target」という単語を探し、その直後にある単語を掴んで、外部のレファレンスファイル「myReference.txt」からrealNameを持ってくる。 その後、処理-----を実行する。 myPath='C:\myData\' print Dir.getwd,"\n" Dir.chdir(myPath) Dir.foreach(myPath) { |myFileName| if /.log/i =~myFileName file_source_body=open(myFileName, "r") while text=file_source_body.gets do if(/Target (\w+\/)/=~text) then myTargetName=$1 ref_file=open("myReference.txt") # (2)のアイテムの部分 while ref_info=ref_file.gets do (/#{myTargetName}\s(\S+)/i=~ref_info) && (realName=$1) end ref_file.close end end ------- ------- ------- }

  • Ruby ファイル出力について

    あるファイルを一行づつ処理したものを、別のbuta.txtというファイルに書き出したいのですが、どうも上手くできません・・・。 誰か助けてください。お願いします。 ■かけるデータの内容■ banana banana ■プログラム■ file_name = ARGV.shift i = open(file_name) z = open("buta.txt", "w") while line = i.gets line.gsub(/a/, "A") line.sub(/a/, "A") ※ここに何かいれる?? end ■buta.txtの内容■ bAnAnA bAnana         になったらいいのですが。

  • Rubyのエンコードについて

    エディタはsublime text 2を使っているのですが 楽しいRuby第四版のサンプルプログラムで学習を始めた当初、エンコードのエラーがでました。 プログラムの行頭に# encoding: UTF-8 とマジックコメントを打ってもエラーはなおらず、プログラムを呼び出す際に、>ruby -E UTF-8 と指定すると問題なく走りました。 で、その後も、日本語を使用したプログラムを実行する際にエンコードをプログラムの行頭で指定していないファイルでも、呼び出す際に「-E UTF-8」としなくても、問題なく走るようになったんですが。 楽しいRuby第四版のサンプルプログラムでlist6.15にstrip.rbというものがあり、内容は file = File.open(ARGV[0]) file.each_line do |line|  next if /^\s*$/ =~ line #空白行  next if /^#/ =~ line  #シャープで始まる行  puts line end file.close というものがあり、これはコマンドラインから指定したファイルから空白行とシャープで始まる行を抜き取って出力するプログラムなんですが、これを実行する際にまたエンコードのエラーが出てしまいます。 プログラムの行頭で# encoding: UTF-8 と指定してもエラーになり、呼び出す際に>ruby -E UTF-8 strip.rb 呼び出すプログラム名 で問題なく走ったのですが、これは毎回呼び出すたびに-E -UTF-8を指定しないと走ってくれません。 日本語は使っていないプログラムなんで正規表現の部分で何かがひっかかっていると思うんですが、何が原因なんでしょうか。 エディタの問題なんでしょうか(ネットで調べるとsublime text 2はUTF-8しか対応していないと書いてありました。 また、パソコンはプログラム学習用として米国製のAcerというノートパソコンを使っています。

    • ベストアンサー
    • Ruby
  • 【ruby】flockで掛けたロックを参照したい

    複数プロセス間で、一つのファイルに対して読み書きしたいです。 その際、ファイルへの書き込み中は、ファイルの読み込みを抑止したいです。 また、読み込みの処理はファイルのロックを参照するだけで、ファイルへのロックは掛けない様にしたいです。 そこで、以下二つプログラムを作成して、簡単な検証を行いました。 ■プログラム1 キーボードからの入力があるまで、ファイルをロックする。 #!/usr/local/bin/ruby file='./hoge.txt' f=open(file,'r+') ret=f.flock(File::LOCK_EX|File::LOCK_NB) STDOUT.write 'Hit any key' STDIN.gets.chomp ■プログラム2 ファイルがロックされているか状態を取得する。 #!/usr/local/bin/ruby require "fcntl" file='./hoge.txt' f=open(file,'r') arg="" f.fcntl(Fcntl::F_GETLK,arg) l_start,l_len,l_pid,l_type,l_whence = arg.unpack('VVVSS') puts l_len ※プログラム2は、fcntlの使い方がマニュアルを読んでもよく理解できなかったので、 手探りで記述しました。 実行すると、プログラム1はエラー無く動きましたが、プログラム2は以下の様なエラーが 出てしまいます。 fcntl.rb:6:in `fcntl': Invalid argument - ./hoge.txt (Errno::EINVAL) from fcntl.rb:6 環境は、unixレンタルサーバ(FreeBSD)です。 上記方法では、上手くいきませんでした。 flockでファイルにロックが掛っているか否かを、そのファイルにロックを掛けることなく 調べるにはどうしたら良いのでしょうか? ご指導のほど、宜しくお願いいたします。

    • ベストアンサー
    • Ruby
  • CSVデータの同じファイルに上書きするには。

    CSV形式でデータdata.csvが書いてあります。プログラムを実行して、そのファイルの$data[4]の値が5という数字だった場合は、そこのセルだけ"解除"という文字に置き換えて(ほかに入ってる値ははそのまま)data.csvに上書きしたいのですが、どうもうまくいきません。したのように記述したのですが、どこが間違っているのかがわかりません。。どなたか教えてください。よろしくおねがいします。 #!/usr/bin/perl $file='data.csv'; open(FILE, "$file"); while(<FILE>){ @data = split(/,/, $_); } close(FILE); if($data[4] eq "5"){$data[4] = "解除";} open(OUT, ">$file"); print OUT @data; close(OUT);

  • ruby のプログラムについての質問です。

    ruby初心者です。作成したプログラムについて質問です。 某サイトの<td>セクター部分のデータを取得するプログラムを作ろうとしています。このプログラムのソースをあげときます。 # encoding: utf-8 require 'rubygems' require 'open-uri' require 'nokogiri' doc = Nokogiri::HTML(open("http://creofuga.net/"),nil,"utf-8") doc.css("td").each do |td| open("foo.txt", "w") do |f| f.write td.text end end このプログラムだと、最初のからデータを取得していくのですが、textファイルに書き込む際、1行目で得たデータを上書きをし、最終的に、サイトの最後の出たのみ出力する形となります。これをデータごとに改行しすべてのデータを出力するにはどのようにプログラムを変更すれば、よいかおしえてください。おねがいします。ちなみに最後に画像で取得したtextファイルのデータを上げときます。よろしくお願いします。

  • 基本プログラミングのrubyの課題を作ってもなかなか動きません。これを

    基本プログラミングのrubyの課題を作ってもなかなか動きません。これをどうやったら動くようになるでしょうか??何がダメなんでしょう?教えてください・・!(>_<;)) 【問題】 問題1-3 についてはプログラムcreate data.rbを一度実行して作られるファイルmarks2010 を元に取り組むこと.ただし,create data.rb は実行する毎に異なるデータを出力するので,課題で作成する提出ファイル(results2010 等) 作成では, 同一のmarks2010 を用いること.また,使用したmarks2010 を提出すること. 1. ファイルmarks2010 は1000 行からなるデータであり,各行は次のように,学生氏名,10 回分 の試験成績が記されている: "西郷あかり": 50, 33, 67, 64, 47, 27, 42, 51: 45 ただし,受験回数が10 回に満たない者もある.また,最終試験を受けた場合,その成績は行 の最後にコロン「:」の後に記載してある. このファイルから下の基準で各学生の最終成績(点数) を求め,全員の最終成績をファイル (results2010 1) に保存するプログラムを書きなさい(prog1.rb). >ruby prog1.rb marks2010 を実行すると,ファイルresults2010 1 が作成されるようにする.ただし,結果のファイル は,各行一人の氏名と成績を次のように記述したものとする: "西郷あかり": 47.3 ※成績は小数点以下第一位まで.それ以下は四捨五入. 成績基準: 全試験(最終試験も含む) の平均点 また,60.0 点以上を合格として,合格者の氏名と本人の最終成績が記されたファイルpassed2010 1 を作成しなさい. 2. 上と同じファイルmarks2010 に対して,次の基準を用いて前問と同様のことを行いなさい.た だし,提出ファイル名は,(prog2.rb), (results2010 2) および(passed2010 2) ? 成績基準:欠席は2 回まで認め,それ以上の欠席の試験は0 点とした平均点※ ? 60 点以上が合格 ※つまり,試験を3回欠席した場合,全10 回の試験のうち,2回の欠席が認められ,残り1 回の欠席は得点0 と計算される.したがって,試験は8回受けたこととして計算され,実際に 受験した7回分の得点と,実際には受けていない1回分の成績0 点の合計点を8 で割った平均 点が最終成績となる. 【私の作ったプログラム】 infile=open("marks2010","r") outfile=open("results2010 1","w") while data=file.gets split(/[:,]/) print data,\n end arry=file.gets s=0 arry.each{ |i| s=s+i } puts s.to_f/arry.size end infile=close outfile=close ちゃんと名前と平均が出ると思ったんですけど・・・・(T_T)泣

    • ベストアンサー
    • Ruby
  • 効率の良いデータ照合のさせ方

    2つのCSVファイル(どちらもデータ件数が1000件を超える)を照合して SQL文の発行の有無を処理するプログラムを組んでいます。↓ open(ファイル1, ファイル1の場所) || die("$!"); while(<ファイル1>){ chomp($_); @data_1 = split(/,/, $_); open(ファイル2, ファイル2の場所) || die("$!"); while(<ファイル2>){ chomp($_); @data_2 = split(/,/, $_);   # ここでファイル1の指定した列のデータとファイル2の指定した列のデータ照合しています。↓   # ($data_1[列]、$data_2[列]) if(($data_1[0] == $data_2[5]) and ($data_1[1] == $data_2[3]) and ($data_1[3] == $data_2[4]) and ($data_1[4] == $data_2[0])){ #insert文     #update文 } } } 上記のような組み方をすると、やはり実行速度がかなり遅くなりました。 8分ぐらい処理にかかってしまいました; 効率的な処理のさせ方ということで、関数などを調べているのですが、 これという関数も見つからず困っています。 プログラムの組み方自体に問題があるとは思うのですが・・ なにぶん、経験が浅いというのもあり・・・; 何か良い方法をご存知の方、ご指導お願いします。

    • ベストアンサー
    • Perl
  • Ruby プログラミング

    "cronで /dog/cat/bird の中の一日より前の古いファイルを消す"というプログラムを作っていただけませんか? 完全に初心者で本を見ながらなんですがどうしていいか分かりません。。 ※Rubyでお願い致します。 ※1文1文説明を付けてくださるとありがたいです。。 どうかお願い致します。。。。。

    • ベストアンサー
    • Ruby