- OpenTofu 语言
- 函数
- csvdecode
csvdecode
函数
csvdecode
解码包含 CSV 格式数据的字符串,并生成一个表示该数据的映射列表。
CSV 是 *逗号分隔值*,一种用于表格数据的编码格式。CSV 有许多变体,但此函数实现了 RFC 4180 中定义的格式。
CSV 数据的第一行被解释为“标题”行:给定的值用作结果映射中的键。后续的每一行都成为结果列表中的一个映射,通过索引将标题行中的键与给定的值匹配。文件中的所有行都必须包含相同数量的字段,否则此函数将产生错误。
示例
> csvdecode("a,b,c\n1,2,3\n4,5,6")
[
{
"a" = "1"
"b" = "2"
"c" = "3"
},
{
"a" = "4"
"b" = "5"
"c" = "6"
}
]
与 for_each
元参数一起使用
您可以将 csvdecode
的结果与 for_each
元参数 一起使用,以描述一组类似的对象,其差异由给定 CSV 文件中的行描述。
CSV 文件中必须有一列可以作为每一行的唯一 ID,然后我们可以将其用作 for_each
表达式中各个实例的跟踪键。例如
locals {
# We've included this inline to create a complete example, but in practice
# this is more likely to be loaded from a file using the "file" function.
csv_data = <<-CSV
local_id,instance_type,ami
foo1,t2.micro,ami-54d2a63b
foo2,t2.micro,ami-54d2a63b
foo3,t2.micro,ami-54d2a63b
bar1,m3.large,ami-54d2a63b
CSV
instances = csvdecode(local.csv_data)
}
resource "aws_instance" "example" {
for_each = { for inst in local.instances : inst.local_id => inst }
instance_type = each.value.instance_type
ami = each.value.ami
}
我们 for_each
参数中的 for
表达式使用 local_id
作为键将 csvdecode
生成的列表转换为映射,这告诉 OpenTofu 使用 local_id
值来跟踪它创建的每个实例。OpenTofu 将创建和管理以下实例地址
aws_instance.example["foo1"]
aws_instance.example["foo2"]
aws_instance.example["foo3"]
aws_instance.example["bar1"]
如果您在后续计划中修改了 CSV 中的一行,则 OpenTofu 会将此解释为对现有对象的更新,只要 local_id
值不变。如果您向 CSV 添加或删除行,则 OpenTofu 将计划根据需要创建或销毁关联的实例。
如果您在 CSV 中找不到可以作为唯一标识符使用的合理值,则可以改为使用 count
元参数 为每个 CSV 行定义一个对象,每个对象都由其在 csvdecode
返回的列表中的索引标识。但是,在这种情况下,如果将来对 CSV 的任何更新更改了列表中特定对象的顺序,可能会造成干扰。我们建议将 for_each
与唯一 ID 列一起使用,以使将来更改的行为更可预测。