質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

2回答

2326閲覧

初心者です。rubyを使った正規表現とファイルの入出力について。

e38284

総合スコア12

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/03/28 09:43

ファイルの先頭の2行を削除したいのと正規表現を使ってcsv形式のデータを1行につき1単語ずつに振り分けたいと考えています。

まず、「ファイルの先頭のn行を削除する」というサンプルコードがあったので使おうとしたのですが、それのどこを変更すればいいのかわかりませんでした。

自分は「sample1.csv」というファイルの先頭から「2行」を削除したいと思ってます。
初歩的な質問ですがよろしくお願いします。

ruby

1require "tempfile" 2 3def remove_head(file,lines) 4 temp=Tempfile.new("mytemp",File.dirname(file)) 5 open(file) do |io| 6 lines.times{io.gets} 7 while line=io.gets 8 temp.write(line) 9 end 10 end 11 temp.close 12 mode=File.stat(fule).mode 13 File.rename(temp.path,file) 14 File.chmod(mode,file) 15end 16 17remove_head(ARGV[0],ARGV[1].to_i)

次に正規表現を使用して

Polyuria/ polydipsia,Physiological,Exercise,, Polyuria/ polydipsia,Physiological,High environmental temperature,, Polyuria/ polydipsia,Diet,Increased salt intake,,

このようなcsv形式のデータを

Polyuria/ polydipsia Physiological Exercise Polyuria/ polydipsia Physiological High environmental temperature Polyuria/ polydipsia Diet Increased salt intake

このようにしたいと思ってます。

sublimetextで正規表現を使って置換したときは
「,([A-Z])」で検索して、「\n$1」に置換しました。
これをruby上で行いたいのですが、どうすればいいかわかりません。

ruby

1diagwd=Array.new 2 3File.open("sample1.csv") {|file| 4 while l=file.gets 5 diagwd << [l.sub(/,([A-Z])/){\n$1}] 6 diagwd.compact! 7 end 8}

よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ruby

1require 'tempfile' 2 3def remove_head(file, lines) 4 temp = Tempfile.new('mytemp', File.dirname(file)) 5 open(file) do |io| 6 lines.times { io.gets } 7 while line = io.gets 8 temp.write(line) 9 end 10 end 11 temp.close 12 mode = File.stat(file).mode 13 File.rename(temp.path, file) 14 File.chmod(mode, file) 15end 16 17remove_head(ARGV[0], ARGV[1].to_i)

remove_head(ファイル名, 削除したい行数)
のように呼び出せばよいです。

実行例:

$ cat data.txt 1111111 2222222 3333333 4444444 5555555 6666666 $ ruby head.rb data.txt 2 $ cat data.txt 3333333 4444444 5555555 6666666

投稿2016/03/28 11:37

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

質問文にあったコード断片をベースに書いてみました。
csv.rb

ruby

1words = [] 2 3File.open('sample1.csv') do |file| 4 while line = file.gets 5 words += line.chomp.split(',') 6 end 7end 8 9words.each do |word| 10 puts word 11end

実行例

$ ruby csv.rb Polyuria/ polydipsia Physiological Exercise Polyuria/ polydipsia Physiological High environmental temperature Polyuria/ polydipsia Diet Increased salt intake

投稿2016/03/28 11:56

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

e38284

2016/03/29 23:09

実行例まで載せていただき、無事解決しました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問