2018-05-13 19:40:57 +02:00
|
|
|
---
|
|
|
|
layout: "functions"
|
2018-12-20 05:35:11 +01:00
|
|
|
page_title: "csvdecode - Functions - Configuration Language"
|
2018-05-13 19:40:57 +02:00
|
|
|
sidebar_current: "docs-funcs-encoding-csvdecode"
|
|
|
|
description: |-
|
|
|
|
The csvdecode function decodes CSV data into a list of maps.
|
|
|
|
---
|
|
|
|
|
2018-05-23 16:27:28 +02:00
|
|
|
# `csvdecode` Function
|
2018-05-13 19:40:57 +02:00
|
|
|
|
2019-01-17 01:33:57 +01:00
|
|
|
-> **Note:** This page is about Terraform 0.12 and later. For Terraform 0.11 and
|
|
|
|
earlier, see
|
|
|
|
[0.11 Configuration Language: Interpolation Syntax](../../configuration-0-11/interpolation.html).
|
|
|
|
|
2018-05-13 19:40:57 +02:00
|
|
|
`csvdecode` decodes a string containing CSV-formatted data and produces a
|
|
|
|
list of maps representing that data.
|
|
|
|
|
|
|
|
CSV is _Comma-separated Values_, an encoding format for tabular data. There
|
|
|
|
are many variants of CSV, but this function implements the format defined
|
|
|
|
in [RFC 4180](https://tools.ietf.org/html/rfc4180).
|
|
|
|
|
|
|
|
The first line of the CSV data is interpreted as a "header" row: the values
|
|
|
|
given are used as the keys in the resulting maps. Each subsequent line becomes
|
|
|
|
a single map in the resulting list, matching the keys from the header row
|
|
|
|
with the given values by index. All lines in the file must contain the same
|
|
|
|
number of fields, or this function will produce an error.
|
|
|
|
|
|
|
|
## Examples
|
|
|
|
|
|
|
|
```
|
|
|
|
> csvdecode("a,b,c\n1,2,3\n4,5,6")
|
|
|
|
[
|
|
|
|
{
|
2019-04-29 19:11:28 +02:00
|
|
|
"a" = "1"
|
|
|
|
"b" = "2"
|
|
|
|
"c" = "3"
|
2018-05-13 19:40:57 +02:00
|
|
|
},
|
|
|
|
{
|
2019-04-29 19:11:28 +02:00
|
|
|
"a" = "4"
|
|
|
|
"b" = "5"
|
|
|
|
"c" = "6"
|
2018-05-13 19:40:57 +02:00
|
|
|
}
|
|
|
|
]
|
|
|
|
```
|
|
|
|
|
|
|
|
## Use with the `count` meta-argument
|
|
|
|
|
|
|
|
It can be tempting to use `csvdecode` to generate a set of similar resources
|
|
|
|
using the `count` meta-argument, as in this example:
|
|
|
|
|
|
|
|
```hcl
|
|
|
|
locals {
|
|
|
|
instances = csvdecode(file("${path.module}/instances.csv"))
|
|
|
|
}
|
|
|
|
|
|
|
|
resource "aws_instance" "example" {
|
|
|
|
count = len(local.instances) # Beware! (see below)
|
|
|
|
|
|
|
|
instance_type = local.instances[count.index].instance_type
|
|
|
|
ami = local.instances[count.index].ami
|
|
|
|
}
|
|
|
|
```
|
|
|
|
|
|
|
|
The above example will work on initial creation, but if any rows are removed
|
|
|
|
from the CSV file, or if the records in the CSV file are re-ordered, Terraform
|
|
|
|
will not understand that the ordering has changed and will instead interpret
|
|
|
|
this as requests for changes to many or all of the instances, which will in
|
|
|
|
turn force these instances to be destroyed and re-created.
|
|
|
|
|
|
|
|
The above pattern can be used with care in situations where, for example, the
|
|
|
|
CSV file is only ever appended to, or if mass-updating the resources would
|
|
|
|
not be harmful, but in general we recommend avoiding the above pattern.
|