Data List Converter
Data List Converter is a tool to convert data between different formats.
Example:
data = [{name: 'James', age: '22'}, {name: 'Bob', age: '33'}]
DataListConverter.convert(:item_data, :table_data, data)
# => [["name", "age"], ["James", "22"], ["Bob", "33"]]
DataListConverter.convert(:item_data, :csv_file, data, csv_file: {filename: 'result.csv'})
DataListConverter.convert(:item_data, :xls_file, data, csv_file: {filename: 'result.csv'})
DataListConverter.convert(:csv_file, :item_data, {filename: 'result.csv'}) == data
You can also add filter to this process:
filter = :limit
filter = {limit: {size: 2}}
filter = [{limit: {size: 12}}, {count: {size: 4}}]
convert(:item_iterator, :table_data, iter, table_iterator: {filter: filter})
Please read the source code for more information, also you can check test examples.
Data Types
- item_data like:
[{name: 'James', age: '22'}, ...] - item_iterator iterator for item_data, used like: iter.call{|item| out << item}
- table_data like:
[["name", "age"], ["James", "22"], ["Bob", "33"], ...] - table_iterator iterator for table_data
- csv_file file in csv format
- xls_file file in excel format
- multi_sheet_data like:
{'sheet1' => [columns, row, row, ...], 'sheet2' => [columns, row, row, ...]} - multi_sheet_iterator like:
{'sheet1' => table_iterator1, 'sheet2' => table_iterator2} - records ActiveRecord records, usage:
DataListConverter.convert(:records, :item_data, query, item_iterator: {columns: [:name, :age]})
Filters
item_iterator/table_iterator limit: limit item_iterator result counts, usage: DataListConverter.convert(:item_data, :table_data, item_data, item_iterator: {filter: {limit: {size: 2}}})
item_iterator count: count item_iterator items, usage: DataListConverter.convert(:xls_file, :item_data, {filename: 'result.xls'}, item_iterator: {filter: {count: {size: 10}}}), it will print current item counts every size.
Extend
You can add your data types and filters, example:
DataListConverter.register_converter(
:records, :item_iterator, lambda { |records, |
columns = [:columns]
lambda { |&block|
records.find_each do |record|
item = columns.map do |column|
[column.first.to_sym, record.send(column[1])]
end.to_h
block.call(item)
end
}
})
DataListConverter.register_filter(
:item_iterator, :limit, lambda { |proc, |
limit_size = [:size] || 10
lambda { |&block|
limit = 0
proc.call do |item|
block.call(item)
limit += 1
break if limit >= limit_size
end
}
})