譯 用 Rust 實現 csv 解析 part1

2022-03-15 03:49:37 字數 3820 閱讀 6677

隨著 csv 1.0 剛剛發布,關於使用 rust 讀取和寫入 csv 資料的教程是時候發布了。本教程針對的是剛入門的 rust 程式設計師,因此有相當多的示例,並花了一些時間在基礎的概念解釋上。你可能會發現,其中部分內容很有用,但對有經驗的 rust 程式設計師來說,快速瀏覽會更有利。

有關 rust 的介紹,請參考官方權威指南。如果你還沒有寫過一行 rust **,但有其他程式語言的經驗,那麼你可能不需要看權威指南就能讀懂本教程。

csv 庫在 github 上是可用的,並且有相應的文件。

最後,這個部落格的文章會作為乙個教程被包含在 api 文件中,並且後續會有所更新。

目標讀者:rust 初學者。

讀取 csv

寫入 csv

管道操作

效能closing thoughts

在開始學習本教程之前,我想簡要介紹 1.0 的方向。rust-csv 倉庫的第一次提交是 2014.3.22,這比 rust 1.0 發行版要早了一年多。對於那些從 1.0 之前就開始接觸 rust 的人來說,肯定還記得該語言發生了多大的變化。當然,我也改變了,因為我變得更熟練和習慣於它。然而,從最初的版本開始,csv 庫的 api 基本保持不變。這使得提高效能和修復 bug 變得更加困難,最糟糕的是,使用了舊版的序列化架構。

csv1.0 版本標誌著這是乙個更快的庫,擁有更好的 api,並支援 rust 序列化框架 serde。

新的 csv 庫附帶乙個csv-corecrate,它可以在沒有 rust 標準庫的情況下解析 csv 資料,並且主要負責效能改進。特別地,舊版的 csv 庫使用了一種有限狀態機,它有很大的開銷。而 csv-core crate 將其解析為乙個基於 dfa 的表,該錶在堆疊上只占用幾百個位元組。結果,我們得到超過 2 倍的效能改進:

count_game_deserialize_owned_bytes  30,404,805 (85 mb/s)   23,878,089 (108 mb/s)    -6,526,716  -21.47%   x 1.27

count_game_deserialize_owned_str 30,431,169 (85 mb/s) 22,861,276 (113 mb/s) -7,569,893 -24.88% x 1.33

count_game_iter_bytes 21,751,711 (119 mb/s) 11,873,257 (218 mb/s) -9,878,454 -45.41% x 1.83

count_game_iter_str 25,609,184 (101 mb/s) 13,769,390 (188 mb/s) -11,839,794 -46.23% x 1.86

count_game_read_bytes 12,110,082 (214 mb/s) 6,686,121 (388 mb/s) -5,423,961 -44.79% x 1.81

count_game_read_str 15,497,249 (167 mb/s) 8,269,207 (314 mb/s) -7,228,042 -46.64% x 1.87

count_mbta_deserialize_owned_bytes 5,779,138 (125 mb/s) 3,775,874 (191 mb/s) -2,003,264 -34.66% x 1.53

count_mbta_deserialize_owned_str 5,777,055 (125 mb/s) 4,353,921 (166 mb/s) -1,423,134 -24.63% x 1.33

count_mbta_iter_bytes 3,991,047 (181 mb/s) 1,805,387 (400 mb/s) -2,185,660 -54.76% x 2.21

count_mbta_iter_str 4,726,647 (153 mb/s) 2,354,842 (307 mb/s) -2,371,805 -50.18% x 2.01

count_mbta_read_bytes 2,690,641 (268 mb/s) 1,253,111 (577 mb/s) -1,437,530 -53.43% x 2.15

count_mbta_read_str 3,399,631 (212 mb/s) 1,743,035 (415 mb/s) -1,656,596 -48.73% x 1.95

count_nfl_deserialize_owned_bytes 10,608,513 (128 mb/s) 5,828,747 (234 mb/s) -4,779,766 -45.06% x 1.82

count_nfl_deserialize_owned_str 10,612,366 (128 mb/s) 6,814,770 (200 mb/s) -3,797,596 -35.78% x 1.56

count_nfl_iter_bytes 6,798,767 (200 mb/s) 2,564,448 (532 mb/s) -4,234,319 -62.28% x 2.65

count_nfl_iter_str 7,888,662 (172 mb/s) 3,579,865 (381 mb/s) -4,308,797 -54.62% x 2.20

count_nfl_read_bytes 4,588,369 (297 mb/s) 1,911,120 (714 mb/s) -2,677,249 -58.35% x 2.40

count_nfl_read_str 5,755,926 (237 mb/s) 2,847,833 (479 mb/s) -2,908,093 -50.52% x 2.02

count_pop_deserialize_owned_bytes 11,052,436 (86 mb/s) 8,848,364 (108 mb/s) -2,204,072 -19.94% x 1.25

count_pop_deserialize_owned_str 11,054,638 (86 mb/s) 9,184,678 (104 mb/s) -1,869,960 -16.92% x 1.20

count_pop_iter_bytes 6,190,345 (154 mb/s) 3,110,704 (307 mb/s) -3,079,641 -49.75% x 1.99

count_pop_iter_str 7,679,804 (124 mb/s) 4,274,842 (223 mb/s) -3,404,962 -44.34% x 1.80

count_pop_read_bytes 3,898,119 (245 mb/s) 2,218,535 (430 mb/s) -1,679,584 -43.09% x 1.76

count_pop_read_str 5,195,237 (183 mb/s) 3,209,998 (297 mb/s) -1,985,239 -38.21% x 1.62

以上就是所有的介紹了,我們可以開始了!

Unity中實現解析CSV檔案

在我們的專案開發過程中,策劃們可能會配置很多的資料在一些文字文字中,例如 物品,隨機名稱等,往往這些資料會放在不同的csv檔案中 逗號分隔值 comma separated values 其檔案以純文字形式儲存 資料,資料與資料之間用英文逗號分割 下面兩張圖為excel 形式轉換為csv形式 建立e...

實現自己的csv檔案解析引擎

前言 這裡僅僅支援excel檔案匯出的csv檔案,解析的核心是乙個正規表示式,這個正規表示式取自 精通正規表示式 一書中,感謝作者。1 解析引擎結構圖 2 很懶很懶,直接上 了 csv 檔案解析 param param xmlinputstream param clazz param file re...

用 Codable 協議實現快速 JSON 解析

如果你之前用過objective c的話,那麼你一定對nsjsonserialization並不陌生。它的總體步驟大致是這樣,先從data物件中解析出nsdictionary或nsarray,然後在從這裡面按照屬性名稱取出需要的值,最後再用這些值給實體物件賦值。總體來說這個操作並不輕鬆,而且比較容易...