[Elixir006]CSV(Comma-separated values)处理

1. CSV文件格式是什么

CSV有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。

Elixir有好几个CSV处理的库(cessocsvcsvlixirex_csv), beatrichartz/cvs写得特别好,用了stream, test coverage(100%),而且有benchmark.

mix new csv_play
cd csv_playemacs mix.exs
defp deps do
    [{:csv, "~> 1.2.0"},
     {:faker, "~>0.5.1"}
    ]
end

2. Faker测试数据

faker用来假造一些测试数据,接下来我们搞一个脚本生成csv数据

mix deps.getmkdir scriptsemacs 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/csv

2. igas/faker



[Elixir006]CSV(Comma-separated values)处理

时间: 2024-11-08 12:21:48

[Elixir006]CSV(Comma-separated values)处理的相关文章

python csv学习

13.1. csv - CSV File Reading and Writing The so-called CSV (Comma Separated Values) format is the most common import and export format for spreadsheets and databases.  There is no "CSV standard", so the format is operationally defined by the man

【 D3.js 进阶系列 — 1.0 】 CSV 表格文件的读取

在入门系列的教程中,我们常用 d3.json() 函数来读取 json 格式的文件.json 格式很强大,但对于普通用户可能不太适合,普通用户更喜欢的是用 Microsoft Excel 或 OpenOffice Calc 等生成的表格文件,因为简单易懂,容易编辑.                       Microsoft Excel 通常会保存为 xls 格式, OpenOffice Calc 通常会保存为 ods 格式.这些格式作为表格文件来说都很强大,但要读取它们是有些麻烦的,D3

Python csv模块的使用

1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在处理数据时都会碰到csv这种格式的文件,它的使用是比 较广泛的(Kaggle上一些题目提供的数据就是csv格式),csv虽然使用广泛,但却没有通用的标准,所以在处理csv 格式时常常会碰到麻烦,幸好python内置了csv模块.下面简单介绍csv模块中最常用的一些函数. 更多内容请参考:https:

CSV模块

Python csv模块的使用 1.csv简介 CSV (Comma Separated Values),即逗号分隔值(也称字符分隔值,因为分隔符可以不是逗号),是一种常用的文本 格式,用以存储表格数据,包括数字或者字符.很多程序在处理数据时都会碰到csv这种格式的文件,它的使用是比 较广泛的(Kaggle上一些题目提供的数据就是csv格式),csv虽然使用广泛,但却没有通用的标准,所以在处理csv 格式时常常会碰到麻烦,幸好python内置了csv模块.下面简单介绍csv模块中最常用的一些函数

支持各种特殊字符的 CSV 解析类 (.net 实现)(C#读写CSV文件)

CSV是一种十分简洁的数据结构,在DOTNET平台实际使用中发现微软官方并没有提供默认的方法,而网上好多例子发现实现并不严谨甚至一些含有明显错误,所以后面自己实现了一个读写工具类,这里发出来希望方便后面朋友(难免还是会有考虑不到的地方,可随时邮件联系) 使用该工具可对csv文件进行读写(甚至不用去了解CSV的各种规范) 直接以List<List<string>> 形式输出,方便进一步处理 因为工具类需要读取文件资源读取完毕后如果确认不会再次读取,建议立即Dispose,以释放文件句

HTML 文件类表单元素如何限制上传类型,Accept属性设置

需求描述:简单的控制file的选择类型 解决方法:使用HTML  input file 的accept属性控制 实例: <form action="demo_form.asp"> <input type="file" name="pic" accept="image/gif,image/jpg" /> <input type="submit" /> </form&g

FileUpload系列:(4)HTML5的 input:file上传类型控制

网页上添加一个input file HTML控件: <input id="File1" type="file" /> 默认情况下,所有文件类型都会显示出来,如果想限制它只显示特定的文件类型呢,比如"word","excel","pdf"文件 解决办法是可以给它添加一个accept属性,比如: <input id="File1" type="file"

html5表单上传控件Files筛选指定格式的文件:accept属性过滤excel文件

摘自:http://blog.csdn.net/jyy_12/article/details/9851349 (IE9及以下不支持下面这些功能,其它浏览器最新版本均已支持.) 1.允许上传文件数量 允许选择多个文件:<input type="file" multiple> 只允许上传一个文件:<input  type="file" single> 2.上传指定的文件格式 <input type="file" acce

SQL*Loader FAQ

SQL*Loader FAQ: Contents [hide] 1 What is SQL*Loader and what is it used for? 2 How does one use the SQL*Loader utility? 3 How does one load MS-Excel data into Oracle? 4 Is there a SQL*Unloader to download data to a flat file? 5 Can one load variable