Rubyå ¥éïŒCSVãã¡ã€ã«ãèªã¿èŸŒãã§ã¿ããïŒ
Rubyã«ãããããã¡ã€ã«ã®å ¥åºåãCSVãã¡ã€ã«ãæ±ãã©ã€ãã©ãªïŒcsvïŒãCSVãã¡ã€ã«ããŒã¿ãæäœãã颿°ïŒreadãtransposeãhash mapãtableãheaderçïŒãããµã³ãã«ã³ãŒãã䜿ããªãã解説ããŸããRubyã§ãCSVãã¡ã€ã«ã®èªã¿èŸŒã¿ã»æžã蟌ã¿ããã¹ã¿ãŒããŸãããïŒããã°ã©ãã³ã°ã«ãããŠã¯ãããŒã¿ã®æå
¥ãããŒã¿ã®äžæ¬å€æãªã©ãCSVãã¡ã€ã«ã®èªã¿èŸŒã¿ãæžã蟌ã¿ãæ±ããããããšãå€ã
ãããŸãã
ã§ã¯ãRubyã§CSVãã¡ã€ã«ãæ±ãããã«ã¯ã©ããªã©ã€ãã©ãªã颿°ãçšæãããŠããã§ããããïŒ
ä»åã¯ãRubyã§ã®CSVãã¡ã€ã«ã®èªã¿èŸŒã¿ã»æžãèŸŒã¿æ¹æ³ããããããã解説ããŠãããŸãã
Rubyã«ãããCSVãã¡ã€ã«ã®æäœïŒåºç€ïŒ

Rubyã§ãã¡ã€ã«ãéãå Žåãã¢ã¯ã»ã¹ã¢ãŒãïŒèªã¿èŸŒã¿ãæžã蟌ã¿ããªã©ïŒããšã³ã³ãŒãã£ã³ã°ïŒæåã³ãŒãïŒã®æå®ãå¿ èŠã§ãããŸããå šäœãèªã¿èŸŒãã®ããè¡ãæåããšã«èªã¿èŸŒãã®ããªã©ãèæ ®ããå¿ èŠããããŸãã
ãã¡ã€ã«ã®å ¥åºåïŒread
ããã¹ããã¡ã€ã«ã®å
容ïŒïŒããã¹ãããŒã¿ïŒãå
šãŠèªã¿èŸŒã¿ããå Žåãopenã¡ãœããã§ãã¡ã€ã«ãéããäžã§ãreadã¡ãœããã䜿ãããšãã§ããŸããèªã¿èŸŒã¿ãçµãã£ãããcloseã¡ãœããã§ãã¡ã€ã«ãéããŸãã
ãµã³ãã«ã³ãŒã
f = File.open("sample.txt")
s = f.read # å
šãŠèªã¿èŸŒã
f.close
p s
sample.txt
äžæäžäŒïŒãã¡ããã¡ãïŒ
äžæ«åéïŒãã£ããããããïŒ
é»å
ç³ç«ïŒã§ããããã£ãïŒ
æ æ èªé©ïŒããããããŠãïŒ
å®è¡çµæ
äžæäžäŒïŒãã¡ããã¡ãïŒ\näžæ«åéïŒãã£ããããããïŒ\né»å
ç³ç«ïŒã§ããããã£ãïŒ\næ æ èªé©ïŒããããããŠãïŒ
ãµã³ãã«ã³ãŒãã§ã¯ãæåã«ãsample.txtããã¡ã€ã«ãéããŠïŒopenïŒå
容ãå
šãŠèªã¿èŸŒã¿ïŒreadïŒãèªã¿èŸŒãã ããŒã¿ãpã¡ãœããã䜿ã£ãŠè¡šç€ºããŠããŸãã
æšæºã©ã€ãã©ãªãcsvã
Rubyã«ã¯ãCSV (Comma Separated Values) ãæ±ãã©ã€ãã©ãªãcsvããçšæãããŠããŸãã
ãã®ã©ã€ãã©ãªã«ã¯ãCSV::Rowã¯ã©ã¹ãCSV::Tableã¯ã©ã¹ãCSV::FieldInfoã¯ã©ã¹ãå«ãŸããŠããŸãã
ã§ã¯å®éã«ãã©ã€ãã©ãªã䜿çšããŠCSVãã¡ã€ã«ã®èªã¿èŸŒã¿ã»æžã蟌ã¿ãè¡ããŸãããã
CSVãã¡ã€ã«ã®èªã¿èŸŒã¿
CSVãã¡ã€ã«ãèªã¿èŸŒãã§ã¿ãŸãããã
ãµã³ãã«ã³ãŒã
require 'csv'
p CSV.read("data.csv")
data.csv
place,minTemp,maxTemp
Okinawa,19,28
Kobe,15,20
Tokyo,17,22
Sapporo,5,12
å®è¡çµæ
[["place", "minTemp", "maxTemp"], ["Okinawa", "19", "28"], ["Kobe", "15", "20"], ["Tokyo", "17", "22"], ["Sapporo", "5", "12"]]
ïŒè§£èª¬ïŒ
1è¡ç®ã§ããcsvãã©ã€ãã©ãªãæå®ããŸãã
2è¡ç®ã§ããcsvãã©ã€ãã©ãªã®readã¡ãœããã§ãdata.csvããã¡ã€ã«ãèªã¿èŸŒã¿ãpã¡ãœããã䜿ã£ãŠè¡šç€ºããŸãã
CSVãã¡ã€ã«ã®æžã蟌ã¿
CSVãã¡ã€ã«ã«æžã蟌ãã§ã¿ãŸãããã
ãµã³ãã«ã³ãŒã
require 'csv'
CSV.open("sample.csv", "w") do |sample|
sample << ["place", "minTemp", "maxTemp"]
sample << ["Okinawa", "19", "28"]
sample << ["Kobe", "15", "20"]
sample << ["Tokyo", "17", "22"]
sample << ["Sapporo", "5", "12"]
end
sample.csv
place,minTemp,maxTemp
Okinawa,19,28
Kobe,15,20
Tokyo,17,22
Sapporo,5,12
ïŒè§£èª¬ïŒ
1è¡ç®ã§ããcsvãã©ã€ãã©ãªãæå®ããŸãã
2è¡ç®ã§ããcsvãã©ã€ãã©ãªã®openã¡ãœããã§ãsample.csvããã¡ã€ã«ãéããŸãã
3è¡ç®ïœ7è¡ç®ã§CSVããŒã¿ãæžã蟌ã¿ãŸãã
Rubyã«ãããCSVãã¡ã€ã«ã®æäœïŒå¿çšïŒ

Rubyã§ã¯CSVãã¡ã€ã«ãæ±ãããéåžžã«äŸ¿å©ãªã¡ãœãããçšæãããŠããŸããæ¬èŠåºãã§ã¯ãCSVãã¡ã€ã«ã®æäœã®å¿çšé¢æ°ãtransposeãhash mapãtableãheaderã解説ããŠãããŸãã
è¡ãšåãå ¥ãæ¿ãããïŒtranspose颿°
CSVãã¡ã€ã«ãèªã¿èŸŒãã åŸãè¡ãšåãå ¥ãæ¿ãããããšããèŠæãåããããšããããŸããäŸãã°æ¬¡ã®ãããªã±ãŒã¹ã§ãã
ãã®ããŒã¿ã¯ãæç©ãšå€æ®µã1è¡ã«è¡šç€ºãããŠããŸã
1è¡ç®ïŒapple, 700
2è¡ç®ïŒbanana, 300
3è¡ç®ïŒmango, 1200
次ã®ããã«ãæç©ãšå€æ®µãããããã§äžæ¬ãã«ãŸãšããããšããå Žåã§ãã
[apple, banana, mango][700, 300, 1200]
é
åã«ä»£å
¥ããåžæã®ãã©ãŒãããã§åºåããããšãã§ããŸãããå
¥ãæ¿ããããã°ã©ã ãæžãã®ã¯æéã«ãªããŸããRubyã§ã¯ãã®èŠæãtransposeã§å®çŸããããšãã§ããŸãã
ãµã³ãã«ã³ãŒã
require 'csv'
product1 = CSV.read("sample.csv")
product2 = product1.transpose
p product2
sample.csv
apple, 700
banana, 300
mango, 1200
å®è¡çµæ
[["apple", "banana", "mango"], [" 700", " 300", " 1200"]]
ïŒè§£èª¬ïŒ
1è¡ç®ã§ããcsvãã©ã€ãã©ãªãæå®ããŸãã
2è¡ç®ã§ããcsvãã©ã€ãã©ãªã®readã¡ãœããã§ããsample.csvããã¡ã€ã«ãèªã¿èŸŒã¿ãŸãã
3è¡ç®ã§ãtransposeã¡ãœããã䜿çšããè¡ãšåãå
¥ãæ¿ããŸãã
4è¡ç®ã§ãpã¡ãœããã§åºåããŸãã
ããã·ã¥ãšãããïŒhash map颿°
Rubyã®ããã·ã¥ã§ã¯ãããŒïŒkeyïŒãšå€ïŒvalueïŒãäžã€ã®ãªããžã§ã¯ããšããŠæ±ããŸãã
äŸãã°ãappleã¯700åãbananaã¯300åãmangoã¯1200åãšããããŒã¿ã®å Žåãkeyã¯ãapple, banana, mangoãã«ãªããvalueã¯ã700å, 300å, 1200åãã«ãªããŸãã
ããããšã¯ãé åãããã·ã¥ãªã©ã®èŠçŽ ã®æ°ã ããããã¯å ã®åŠçãç¹°ãè¿ããçµæãšããŠäœæãããé åãè¿ããŸãããcollectã¡ãœããããšè¡šèšããå ŽåããããŸãã
mapã¡ãœããã«ã¯ãæ±çšæ§ãé«ããããã«ãèšè¿°éãåæžããããšããã¡ãªããããããŸããäŸãã°ãäžèšã®æç©ã®å€æ®µã«éæãèæ
®ããŠäžåŸ2åã«å€äžãããããšããèŠæããã£ãå Žåãmapã¡ãœããã䜿çšãããšã³ãŒããã·ã³ãã«ã«èšè¿°ããããšãã§ããŸãã
ãµã³ãã«ã³ãŒã
fruits1 = {"apple": 700, "banana": 300, "mango": 1200}
fruits2 = fruits1.map {|key,val| [key,val * 2]} # valueã2åãã
p fruits2
å®è¡çµæ
[[:apple, 1400], [:banana, 600], [:mango, 2400]]
ïŒè§£èª¬ïŒ
1è¡ç®ã§ãfruits1ãšããããã·ã¥ãäœæããŸãã
2è¡ç®ã§ãããã·ã¥ã®valueå€ã2åã«ããŸãã
3è¡ç®ã§ãçµæãåºåããŸãã
ããããŒã»åã»è¡ãäžæ°ã«ååŸãããïŒtable/header
éåžžãCSVãã¡ã€ã«ã¯ããããŒéšåãšããŒã¿éšåããããŸãããŸããCSVãã¡ã€ã«èªäœtableæ§é ãšãªã£ãŠããŸããRubyã«ã¯ããããã®ããŒã¿æ§é ã«å¯Ÿå¿ãã䟿å©ãªã¡ãœãããçšæãããŠããŸãã
ã§ã¯ãå®éã«äœ¿ã£ãŠã¿ãŸãããã
ãµã³ãã«ã³ãŒã
require "csv"
table = CSV.table('data.csv')
p table.headers #ããããŒéšãåºå
p table[1] #ããŒã¿éšãåºå
p table[:place] # å Žæã®å€ã ããåºå
data.csv
place,minTemp,maxTemp
Okinawa,19,28
Kobe,15,20
Tokyo,17,22
Sapporo,5,12
å®è¡çµæ
[:place, :mintemp, :maxtemp]
#<CSV::Row place:"Kobe" mintemp:15 maxtemp:20>
["Okinawa", "Kobe", "Tokyo", "Sapporo"]
ïŒè§£èª¬ïŒ
1è¡ç®ã§ããcsvãã©ã€ãã©ãªãæå®ããŸãã
2è¡ç®ã§ããcsvãã©ã€ãã©ãªã®tableã¡ãœããã§ãdata.csvããã¡ã€ã«ãèªã¿èŸŒã¿ãŸãã
3è¡ç®ã§ãããããŒéšãåºåããŸãã
4è¡ç®ã§ãããŒã¿éšãåºåããŸãã
5è¡ç®ã§ã瞊軞placeãåºåããŸãã
CSVãã¡ã€ã«ã®èªã¿èŸŒã¿ãšæžã蟌ã¿

ã§ã¯ãæ¬èšäºã§åŠãã ããšããµã³ãã«ã³ãŒãã䜿ã£ãŠåŸ©ç¿ããŸãããã
æ¬ãµã³ãã«ã³ãŒãã§ã¯ããŸãæç©ã®CSVãã¡ã€ã«ããŒã¿ãsample1.csvããèªã¿èŸŒã¿ãŸãã倿®µæ å ±ã倿ŽåŸãCSVãã¡ã€ã«ãsample2.csvãã«æžãåºããŸãã
ãµã³ãã«ã³ãŒã
require "csv"
table = CSV.table('sample1.csv') #CSVãã¡ã€ã«ãããŒãã«ã«èªã¿èŸŒã
table[:price] = table[:price].map! {|x| [x + 500]} #æç©ã®å€æ®µã«éæ500åããã©ã¹ãã
p table.headers #ããããŒéšãåºå
p table[0] #ããŒã¿éšãåºå
File.write('sample2.csv', table) #ããŒãã«æ
å ±ãåºåãã
sample1.csv
product, price
apple, 700
banana, 300
mango, 1200
å®è¡çµæ
#<CSV::Table mode:col_or_row row_count:4>
#<CSV::Row product:"apple" price:[1200]>
sample2.csv
product, price
apple, 1200
banana, 800
mango, 1700
ïŒè§£èª¬ïŒ
1è¡ç®ã§ããcsvãã©ã€ãã©ãªãæå®ããŸãã
2è¡ç®ã§ãcsvã©ã€ãã©ãªã®tableã¡ãœããã§ãCSVãã¡ã€ã«ãsample1.csvããèªã¿èŸŒã¿ãŸãã
3è¡ç®ã§ãæç©ã®å€æ®µã«éæ500åããã©ã¹ããŸãã
4è¡ç®ã5è¡ç®ã§ãtableã®ããŒã¿ã倿ŽãããŠããããšã確èªããŸãã
6è¡ç®ã§ã倿®µã倿ŽãããtableããŒã¿ããCSVãã¡ã€ã«ãsample2.csvããšããŠåºåããŸãã
ãŸãšã
åæããŒã¿ã®æå
¥ãããŒã¿ã®äžæ¬å€æãªã©ãè¡ãå ŽåãCSVãã¡ã€ã«ã®èªã¿èŸŒã¿ãæžã蟌ã¿ã¯é¿ããŠã¯éããŸããã
Rubyã«ã¯ãCSVãã¡ã€ã«ãæ±ãããã«äŸ¿å©ãªã©ã€ãã©ãªã颿°ãçšæãããŠããŸãããããã®ã©ã€ãã©ãªã颿°ãå®è·µã§æŽ»çšããŠãããŸãããïŒ
ãã®èšäºã®ããŒã¯ãŒãã«é¢ããå匷äŒã»ã€ãã³ããæ¢ã
TECH PLAYã§ã¯ãITãšã³ãžãã¢åãã®å匷äŒã»ã€ãã³ãæ å ±ãæäŸããŠããŸããèå³ã®ããæ¹ã¯ãã²ãåå ãã ããã
- ãRubyãã«é¢ããå匷äŒã»ã€ãã³ããæ¢ã
- ãããã°ã©ãã³ã°ãã«é¢ããå匷äŒã»ã€ãã³ããæ¢ã
- ãåå¿è ãã«é¢ããå匷äŒã»ã€ãã³ããæ¢ã












