wafuの技術

技術習得の努力メモです。

Ruby open-uriのエラー

rubyのopen-uriでエラーが出ました。

initialize': Invalid argument @ rb_sysopen - https://www.aaa.com (Errno::EINVAL)

確認すると、
Rubyの3からは
openではなく、URI.openを使うようです。

require 'open-uri'
url = 'https://www.aaa.com'
#aaa = open(url)                    エラー
aaa = URI.open(url)    Ruby3の場合


ありがとうございます。
hawksnowlog: Ruby3 以降では open-uri は URI.open を使用する必要がある

RubyでCSV

CSVファイルの読み込み

TSV版

require 'csv'
CSV.open("sample.tsv'.col_sep:"\t",headers:true) do |csv|
    csv.read do |row|
         row.each do |header,value|
             puts "#{header}:#{value}"
         end
         puts '-----'
   end
end

CSVファイルの読み込み2

require 'csv'
data = CSV.read('sample.csv')
puts data

CSVファイルの読み込み3

datas = CSV.read('sample.csv')
datas.each do |data|
   puts data[0] + "\t" + data[1]
end

CSVファイルの読み込み4

require 'csv'
CSV.foreach('sample.csv') {|row|
    puts row[0] + "\t" + row[1] + "\t" + row[2]
}

■CSVファイルをテキストに変換する
変数 = <配列>.to_csv

■テキストをCSV配列に変換する
変数 = <テキスト>.parse_csv


■CSVファイルの書き出し
>||
require 'csv'
out = CSV.open('sample2.csv','w')
out << ["A","B","C"]
out << ["Ruby","Python","Rust"]
out.close

CSVファイルの書き出し

require 'csv'
CSV.open('sample2.csv','w') do |out|
    out <<  <配列>
end

■テキストファイルを読み込んでCSVファイルに変換

require 'csv'
result = []
File.foreach('sample.txt') do |line|
    result << line.parse_csv
end
CSV.open('sample.csv','w') do |csv|
    result.each do |row|
        csv << row
    end
end

Rubyで文字変換(編集中)

Rubyで値の変更メモ

#ASCIIコードを文字に変換
a = 65
a.char #=>"A"

#数字を文字に変換
a.to_s #=> "65"

#数字を16進数に変換
a.to_s(16)   #=> "a"
a.to_s.hex() #=> "16" 10を16にしたら意味が違う・・・

#その他変換
"11111111".to_i(2) #=>255
"255".to_i(10)     #=>255
"FF".to_i(16)      #=>255

#クラスの確認
a.class   #=> Integer

Rubyのブロック構文とdo

Rubyを勉強していて、理解ができなかったのが、ブロックという考え方です。

ループ処理ならわかるのですが、処理の単位ということでしょう。

■eachメソッドの例

(1..10).each do |v|
    puts v
end

doからendをブロックとして表す。
この処理は{}でも表せます。

(1..10).each {|v|
    puts v
}

一般的に複数行に渡る場合やブロックを記述する場合には、do...endを使用。
1行で記述する場合は、{....}を書くようです。

(1..10).each {|v| puts v}

Rubyでファイル処理(1)

Rubyでファイルの読み込み

Rubyの読み込みはブロックの読み込みが一般的なようです。
ブロックは、{}で囲んだ方法です。
特徴は、open,closeが不要です。

■1行ずつ読み込み

File.open("sample.txt","r") do |f|
    while line = f.gets
        puts(line)
    end
end

■1行ずつ読み(使えるのかな)

num = 1
File.open("sample.txt","r") do |f|
    f.each_line{|line|
        puts(num.to_s + ": " + line)
        num = num + 1
   }
end

■指定のバイト数を読み込む

File.open("sample.txt","r") do |f|
    puts(f.read(10))
    puts(f.read)
end

■各行を配列の要素として読み込む

File.open("sample.txt","r") do |f|
    lines = f.readlines
    puts(lines[0])              #1行目を出力
end

■ファイルにデータを書き込む

File.open("sample.txt","w") do |f|
    f.puts("sunday")        #改行付きで出力 
    f.print("monday")      #改行なしで出力
end

■バイナリファイルの読み込み(ブロック未使用)

io = File.open("aa.jpg","rb")
buf = io.read(400)
m = buf.unpack("i*")
p m[0]

■文字配列をファイルに書き込む

a = ["C++","COBOL,"FORTRAN","Go"]
File.open("sample.txt","w") do |f|
    a.each{|s|
         f.puts(s)
    }
end

■バイナリファイルの読み込みと書き込み

File.open("aa.jpg","rb")  do |infile|
    File.open("bb.jpg",wb") do |outfile|
         while d = infile.read(1)
               outfile.write(d)
         end
    end
end

■簡単な読み込み

a = File.read("aa.jpg")    #ファイルの読み込み
File.write("bb.jpg",a)      #ファイルの書き出し

Rubyで別のRubyを呼び出す

Rubyで別のRubyを呼び出す

main.rb

puts “start”
IO.popen(“ruby sub.rb”) do |f|
    f.each do |line|
            print line
    end
end
puts “finish”

sub.rb

STDOUT.sync = true      #文字列を全て受け取る
puts “sub start”
sleep 4
puts “sub end”

実行結果

start
sub start
sub finished
finish