• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:RubyによるCSVファイルの該当行の取り出し)

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

このQ&Aのポイント
  • RubyによるCSVファイルの該当行の取り出し方法について教えてください。
  • CSVファイルの1-4行目の数値を無視して、5行目以降の内容を取得する方法を教えてください。
  • Rubyプログラムを使用してCSVファイルから特定の行を抽出する方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.4

>編集対象のCSVファイルが複数あるので、まとめて対象とすることは可能でしょうか。 >正規表現 "*aaa*.csv"とかで、一気に編集できないかと思案しております。 もちろんできますよ。 ただファイル名の指定だと正規表現ではなくてワイルドカードを使ったほうが お手軽にできますのでまずはそれで。 infiles = ARGV.map{|e| Dir.glob(e)}.flatten p infiles #デバッグ用 infiles.each do |infile| open(infile, 'r') do |rf| out_log = infile + ".log" open(out_log, 'a') do |wf| wf.puts rf.readlines[5..-1] end end end これを ruby mogera.rb *aaa*.csv *bbb*.csv のように実行すると、.logという拡張子をつけたファイルに順次出力していきます。 あ、でも ruby 1.8.4 (2005-12-24) [i386-cygwin] cygwin版だと自分で Dir.glob しなくてもワイルドカードの展開をしてくれたかな? どうしても正規表現で指定したいというなら補足で書いてください。

hokuhoku7
質問者

お礼

できました。感謝です! 大変助かりました、また機会がありましたら、ご教示よろしくお願い致します。

その他の回答 (3)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

すみません。一つ訂正。 #2のスクリプトだと入力ファイルの「6行目」から出力します。 適当に数字いじってくださいませ。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

ちなみに、delete_atが使えるかと思ったのですが、 <snip> csv_word.delete_at(1) p csv_word <snip> エラー表示となってしましました、追加でメソッドのインストールが必要っぽいです。 delete_at は Arrayなどで使えるメソッドす。 csv_wordは質問にあるスクリプトでは Stringクラスのオブジェクトですから、 NoMethodエラーになります。 でかいファイルを処理したいのならちょっと工夫が要りますが、 お手軽に済ませたいならこんな感じでどうですか? open('sample.csv', 'r') do |rf| open('newfile.csv', 'w') do |wf| wf.puts rf.readlines[5..-1] end end って#1のお礼を見ると自分で解決している?

hokuhoku7
質問者

お礼

ありがとうございます。できました。 ぜんぜん解決してませんでしたので、大変助かりました! ご存知であれば追加でご教示いただきたいのですが、対象のCSVファイルはコマンドラインから、引数で取得するようにしたのですが、 <snip> open(p1, 'r') do |rf| open(out_log,'a') do |wf| wf.puts rf.readlines[5..-1] end end <snip> 編集対象のCSVファイルが複数あるので、まとめて対象とすることは可能でしょうか。正規表現 "*aaa*.csv"とかで、一気に編集できないかと思案しております。

  • koko_u_
  • ベストアンサー率18% (459/2509)
回答No.1

$. に最後に読んだ行番号がセットされているみたいなので、書き出すときに if $. > 4 とかすれば? 「5 行目以降」に特殊な意味がないのであれば、行が # で始まるときはスキップするなどとコーディングした方がよさそうですけど。

hokuhoku7
質問者

お礼

配列の要素を編集してもしょうがなかったです。 無視してください。 while csv_word = file_csv.gets do csv_word.slice!(0,6) chk_value_log.print csv_word

hokuhoku7
質問者

補足

具体的な記載に関して、ご教示頂けるかたがいらっしゃれば助かります。 ちなみに、delete_atが使えるかと思ったのですが、 <snip> csv_word.delete_at(1) p csv_word <snip> エラー表示となってしましました、追加でメソッドのインストールが必要っぽいです。 aaaaa.rb:38: undefined method `delete_at' for #<String:0x100d3c50> (NoMethodError)

関連するQ&A