- ベストアンサー
RubyによるCSVファイルの該当行の取り出し
- RubyによるCSVファイルの該当行の取り出し方法について教えてください。
- CSVファイルの1-4行目の数値を無視して、5行目以降の内容を取得する方法を教えてください。
- Rubyプログラムを使用してCSVファイルから特定の行を抽出する方法を教えてください。
- みんなの回答 (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 しなくてもワイルドカードの展開をしてくれたかな? どうしても正規表現で指定したいというなら補足で書いてください。
その他の回答 (3)
- sakusaker7
- ベストアンサー率62% (800/1280)
すみません。一つ訂正。 #2のスクリプトだと入力ファイルの「6行目」から出力します。 適当に数字いじってくださいませ。
- sakusaker7
- ベストアンサー率62% (800/1280)
ちなみに、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のお礼を見ると自分で解決している?
お礼
ありがとうございます。できました。 ぜんぜん解決してませんでしたので、大変助かりました! ご存知であれば追加でご教示いただきたいのですが、対象の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)
$. に最後に読んだ行番号がセットされているみたいなので、書き出すときに if $. > 4 とかすれば? 「5 行目以降」に特殊な意味がないのであれば、行が # で始まるときはスキップするなどとコーディングした方がよさそうですけど。
お礼
配列の要素を編集してもしょうがなかったです。 無視してください。 while csv_word = file_csv.gets do csv_word.slice!(0,6) chk_value_log.print csv_word
補足
具体的な記載に関して、ご教示頂けるかたがいらっしゃれば助かります。 ちなみに、delete_atが使えるかと思ったのですが、 <snip> csv_word.delete_at(1) p csv_word <snip> エラー表示となってしましました、追加でメソッドのインストールが必要っぽいです。 aaaaa.rb:38: undefined method `delete_at' for #<String:0x100d3c50> (NoMethodError)
お礼
できました。感謝です! 大変助かりました、また機会がありましたら、ご教示よろしくお願い致します。