csv

Pulls CSV data from .csv files into a hash of arrays keyed by the headers. First row is assumed to be the header row.

Parsing uses Ruby’s CSV, with options {headers: true, converters: :numeric} http://www.ruby-doc.org/stdlib-2.0/libdoc/csv/rdoc/CSV.html

The csv method is a member of Squib::Deck, but it is also available outside of the Deck DSL with Squib.csv(). This allows a construction like:

data = Squib.csv file: 'data.csv'
Squib::Deck.new(cards: data['name'].size) do
end

If you have multiple source files which you would like to concatenate use the following:

cards1 = Squib.csv file: 'cards1.tsv', col_sep: "\t"
cards2 = Squib.csv file: 'cards2.tsv', col_sep: "\t"

all_cards = cards1
all_cards['column1'] += cards2['column1']
all_cards['column2'] += cards2['column2']

Options

file

default: 'deck.csv'

the CSV-formatted file to open. Opens relative to the current directory. If data is set, this option is overridden.

data

default: nil

when set, CSV will parse this data instead of reading the file.

strip

default: true

When true, strips leading and trailing whitespace on values and headers

explode

default: 'qty'

Quantity explosion will be applied to the column this name. For example, rows in the csv with a 'qty' of 3 will be duplicated 3 times.

col_sep

default: ','

Column separator. One of the CSV custom options in Ruby. See next option below.

quote_char

default: '"'

Character used to quote strings that have a comma in them. One of the CSV custom options in Ruby. See next option below.

CSV custom options in Ruby standard lib.
All of the options in Ruby’s std lib version of CSV are supported except headers is always true and converters is always set to :numeric. See the Ruby Docs for information on the options.

Warning

Data import methods such as xlsx and csv will not consult your layout file or follow the Squib Thinks in Arrays feature.

Individual Pre-processing

The xlsx method also takes in a block that will be executed for each cell in your data. This is useful for processing individual cells, like putting a dollar sign in front of dollars, or converting from a float to an integer. The value of the block will be what is assigned to that cell. For example:

resource_data = Squib.csv(file: 'sample.xlsx') do |header, value|
  case header
  when 'Cost'
    "$#{value}k" # e.g. "3" becomes "$3k"
  else
    value # always return the original value if you didn't do anything to it
  end
end

Examples

To get the sample Excel files, go to its source

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
require 'squib'

Squib::Deck.new(cards: 2) do
  background color: :white

  # Outputs a hash of arrays with the header names as keys
  data = csv file: 'sample.csv'
  text str: data['Type'], x: 250, y: 55, font: 'Arial 18'
  text str: data['Level'], x: 65, y: 65, font: 'Arial 24'

  save format: :png, prefix: 'sample_csv_'

  # You can also specify the sheet, starting at 0
  data = xlsx file: 'sample.xlsx', sheet: 2
end

# CSV is also a Squib-module-level function, so this also works:
data      = Squib.csv file: 'quantity_explosion.csv' # 2 rows...
num_cards = data['Name'].size                        #          ...but 4 cards!

Squib::Deck.new(cards: num_cards) do
  background color: :white
  rect # card border
  text str: data['Name'], font: 'Arial 18'
  save_sheet prefix: 'sample_csv_qty_', columns: 4
end

# Additionally, CSV supports inline data specifically
data = Squib.csv data: <<-EOCSV
Name,Cost
Knight,3
Orc,1
EOCSV

Here’s the sample.csv

1
2
3
Type,"Level"
Thief,1
Mastermind,2

Here’s the quantity_explosion.csv

1
2
3
Name,qty
Basilisk,3
High Templar,1