[Elixir006]CSV(Comma-separated values)处理
2016-04-04 01:31
429 查看
1. CSV文件格式是什么
CSV有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。Elixir有好几个CSV处理的库(cesso, csv, csvlixir, ex_csv), beatrichartz/cvs写得特别好,用了stream, test coverage(100%),而且有benchmark.
mix new csv_play cd csv_play emacs mix.exs
defp deps do [{:csv, "~> 1.2.0"}, {:faker, "~>0.5.1"} ] end
2. Faker测试数据
faker用来假造一些测试数据,接下来我们搞一个脚本生成csv数据mix deps.get mkdir scripts emacs scripts/generate_csv_data.exs
Faker.start count = 10_000 headers = ~w(name company city) data = 1..count |> Enum.map(fn(_) -> [Faker.Name.first_name <> Faker.Name.last_name, Faker.Company.name, Faker.Address.city] end) file = File.open!("sample_data.csv", [:write]) [headers | data] |> CSV.encode |> Enum.each(&IO.write(file, &1)) :ok = File.close(file)
mix run scripts/generate_csv_data.exs
3.CSV decode示例
我们来测试一下csv的header读得是否正确mkdir test/data/ mv sample_data.csv test/data/ emacs test/csv_play_test.exs
defmodule CsvPlayTest do use ExUnit.Case @data_path "test/data/sample_data.csv" test "reading CSV as a list" do list = @data_path |> File.stream! |> CSV.decode |> Enum.to_list assert hd(list) == ["name", "company", "city"] end end
通常我们的cvs数据量都是非常大的,所以我们使用stream一块一块的来处理成map。
test "reading CSV as a map" do list = @data_path |> File.stream! |> CSV.decode(headers: true) |> Enum.to_list sorted_keys = list |> hd |> Map.keys |> Enum.sort assert sorted_keys == Enum.sort(["name", "company", "city"]) end
当然你CSV decode时还可以指定分割符是什么(默认就是上面这种形式的逗号)
CSV.decode(separator: ?\t)
Resources
1. beatrichartz/csv2. igas/faker
How I felt when I understood Elixir error messages for the first time
![](https://images2015.cnblogs.com/blog/629822/201604/629822-20160404122815640-1099806452.gif)
相关文章推荐
- Textarea - 百度富文本编辑器插件UEditor
- php函数mysql_query批量执行多句sql语句
- Ant_的最完整build.xml解释
- Apue学习:线程
- UITableView优化
- DuiLib(6)——界面管家CPaintManagerUI的函数简介
- UICollectionView基础
- lintcode:Unique Binary Search Trees II
- DuiLib(5)——CWindowWnd窗口函数简介
- [Queue]——面向接口编程
- 【POJ2926】Requirements【二进制】【最大曼哈顿距离】
- String、StringBuffer和StringBuilder
- lintcode: Unique Binary Search Trees
- [html][LigerUI]使用示例
- DELL DOSA 6.X 服务器引导光盘Dell Systems Build and Update Utility ISO下载地址
- IOS9 UIStackView简介
- DuiLib(4)——消息响应
- Android 入门三 UI界面
- 02-线性结构3 Pop Sequence
- request 和 response之间实现servlet线程非阻塞