<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
CSV格式的資料預設是以逗號分隔各個欄位的一條一條記錄,預設用換行符分隔每一條記錄。此外,有的CSV有標題行,有的沒有。還有其他一些格式, 它們都有預設值,但都可以在讀、寫CSV資料時修改預設設定。後文大多數時候故意忽略這些設定,因為絕大多數讀寫操作都使用同樣的引數**options
進行格式設定。例如,在讀取csv檔案中的資料時想要忽略標題行,可以在引數中設定headers: true
可設定的項及其預設值包括:
col_sep: ",", #=> 欄位分隔符 row_sep: :auto, #=> 記錄分隔符 quote_char: '"', #=> 包圍欄位的符號 field_size_limit: nil, #=> 限制欄位的字元數量 converters: nil, #=> unconverted_fields: nil, headers: false, #=> 讀取時忽略標題行,具體參考官方手冊 return_headers: false, write_headers: nil, header_converters: nil, skip_blanks: false, #=> 忽略空行 force_quotes: false, #=> 設定為true時,所有欄位都將使用被包圍 skip_lines: nil, #=> 指定一個正則(str也會轉換為正則), #=> 匹配的行將被當作註釋行而忽略 liberal_parsing: false, internal_encoding: nil, external_encoding: nil, encoding: nil, nil_value: nil, #=> 使用此處設定的值替換所有nil欄位 empty_value: "", #=> 使用此處設定的值替換所有空字串欄位 quote_empty: true, #=> 設定為false時,空字串欄位將轉換為空欄位 write_converters: nil, write_nil_value: nil, #=> 將以此處的值替換nil欄位寫入檔案 write_empty_value: "", strip: false
要向檔案中寫入CSV格式的資料:
require 'csv' writer = CSV.open('/tmp/file.csv', 'w') writer << ["junmajinlong", 29, 170, true] writer << ["junma", 24, 176, false] writer << ["jinlong", 25, 172, nil] writer << ["majinlong", 23, 173, false] writer.close
寫入完成後,檢視:
junmajinlong,29,170,true junma,24,176,false jinlong,25,172, majinlong,23,173,false
注意其中的nil對應的寫入內容為空。
可以直接在語句塊中寫入,這樣的話可以自動關閉CSV.open()開啟的IO流:
require 'csv' CSV.open('/tmp/file.csv', 'w') do |writer| writer << ["junmajinlong", 29, 170, true] writer << ["junma", 24, 176, false] writer << ["jinlong", 25, 172, nil] writer << ["majinlong", 23, 173, false] end
CSV.open()開啟的是一個封裝後的IO流物件,它除了可以使用CSV單獨為其提供的一些方法(比如這裡的<<
)外,還可以使用很多IO流物件的方法,比如seek()、tell()、flush()、eof?()、fsync()等等。
這裡使用的<<
方法是單獨為其提供的,它涉及兩個執行過程:
如果只是想執行第一個過程,即將資料轉換成CSV格式的字串而不寫入,可使用類方法generate_line()
:
p CSV.generate_line ["junmajinlong", 29, 170, true] p CSV.generate_line ["jun ma", 24, 176, false] p CSV.generate_line ["jinlong", 25, 172, nil] p CSV.generate_line ["jin, long", 23, 173, false] =begin "junmajinlong,29,170,truen" "jun ma,24,176,falsen" "jinlong,25,172,n" ""jin, long",23,173,falsen" =end
如果想要讀取CSV檔案,可使用類方法read()或別名readlines():
pp CSV.readlines('/tmp/file.csv') =begin [["junmajinlong", "29", "170", "true"], ["junma", "24", "176", "false"], ["jinlong", "25", "172", nil], ["majinlong", "23", "173", "false"]] =end
注意:
如果要按行讀取CSV檔案的內容,使用類方法foreach():
CSV.foreach('/tmp/file.csv') do |row| p row end =begin ["junmajinlong", "29", "170", "true"] ["junma", "24", "176", "false"] ["jinlong", "25", "172", nil] ["majinlong", "23", "173", "false"] =end
如果想要從字串中讀取CSV格式的資料,使用parse()和parse_line(),分別用於解析多行字串和解析單行字串(超出一行的自動被忽略)。
str1=<<-eof junmajinlong,29,170,true jun ma,24,176,false jinlong,25,172, "jin, long",23,173,false eof # 不指定語句塊時,parse返回陣列 pp CSV.parse str1 =begin [["junmajinlong", "29", "170", "true"], ["jun ma", "24", "176", "false"], ["jinlong", "25", "172", nil], ["jin, long", "23", "173", "false"]] =end # 指定語句塊時,parse將每行對應的陣列傳遞給語句塊 CSV.parse(str1) {|row| p row} =begin ["junmajinlong", "29", "170", "true"] ["jun ma", "24", "176", "false"] ["jinlong", "25", "172", nil] ["jin, long", "23", "173", "false"] =end str2="junmajinlong,29,170,true" p CSV.parse_line str2 ["junmajinlong", "29", "170", "true"]
CSV.new()
、CSV.open()
可以建立csv物件(即一行一行csv格式的資料)CSV.generate()
可將字串轉換成csv物件並將該物件傳遞給語句塊<<
、puts()
或add_row()
可向CSV目標中(字串格式的CSV或CSV IO流)寫入行,它們是別名關係gets()
、shift()
、readline()
可從csv物件中讀取一行資料read()
、readlines()
可以讀取csv物件中的所有資料each()
可以從csv物件中迭代每一行eof()
或eof?()
可以判斷是否讀完所有資料rewind()
可以重置當前csv物件的偏移指標line()
可以獲取最近一次讀取的一行資料lineno()
可以獲取當前已讀取的行數path()
可以獲取當前讀取的csv檔名CSV.parse()、CSV.read()、CSV.table()等方法返回的都是陣列的陣列(二維陣列),它們是CSV Table。
CSV table按照表的方式來處理csv資料,比如關注於行、關注於欄位的一些操作可以採用csv table相關的方法來處理。
# Headers are part of data data = CSV.parse(<<~ROWS, headers: true) Name,Department,Salary Bob,Engineering,1000 Jane,Sales,2000 John,Management,5000 ROWS data.class #=> CSV::Table data.first #=> #<CSV::Row "Name":"Bob" "Department":"Engineering" "Salary":"1000"> data.first.to_h #=> {"Name"=>"Bob", "Department"=>"Engineering", "Salary"=>"1000"} # Headers provided by developer data = CSV.parse('Bob,Engineering,1000', headers: %i[name department salary]) data.first #=> #<CSV::Row name:"Bob" department:"Engineering" salary:"1000">
讀取CSV資料時,所有的資料都會轉換為字串格式。
# Without any converters: CSV.parse('Bob,2018-03-01,100') #=> [["Bob", "2018-03-01", "100"]]
可以在迭代每一行的語句塊中對欄位做必要的型別轉換。
但如果型別轉換方式比較簡單,可以在讀取資料時指定converters屬性進行轉換。該屬性的值要麼是CSV的內建型別符號,要麼是符號陣列,要麼是一個lambda表示式。有如下內建型別:
Integer Float Numeric (Float + Integer) Date DateTime All
當指定了型別轉換後,每個欄位將針對converters的值嘗試做轉換,轉換失敗則保留欄位的值不變,所以如果通過lambda自定義型別轉換時也一定要保證這一點。
CSV.parse("1,2,3,4,5", converters: :numeric) #=> [[1, 2, 3, 4, 5]] # With built-in converters: ct = CSV.parse('Bob,2018-03-01,100', converters: %i[numeric date]) #=> [["Bob", #<Date: 2018-03-01>, 100]] ct.first[1] + 1 # 日期物件,加1天 #=> #<Date: 2018-03-02 ((2458180j,0s,0n),+0s,2299161j)> # With custom converters: CSV.parse('Bob,2018-03-01,100', converters: [->(v) { Time.parse(v) rescue v }]) #=> [["Bob", 2018-03-01 00:00:00 +0200, "100"]]
更多關於Ruby操作CSV格式資料方法請檢視下面的相關連結
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45