我有一个 CSV 文件,其中包含以下内容:
id,value
123,{"M":{"name_1":{"S":"value_1"}, "name_2":{"S":"value_2"}}}
我正在尝试读取此 CSV 文件并通过以下方式在 DynamoDB 中创建记录:
locals {
custom_data = csvdecode(file("${path.module}/../custom_data.csv"))
}
resource "aws_dynamodb_table_item" "custom_table_item" {
for_each = {for row in local.custom_data : row.id => row}
table_name = aws_dynamodb_table.custom_table.name
hash_key = aws_dynamodb_table.custom_table.hash_key
item = jsonencode({
"id" : { "S" : each.value.id },
"value" : jsondecode(each.value.value)
})
lifecycle {
ignore_changes = [item]
}
}
但是,此代码不起作用,并且我找不到任何有关如何以可以创建jsondecode
适当的 JSON 结构的方式从 CSV 文件中读取双引号值的示例。有谁知道这是怎么做到的吗?
清理您的 csv 文件:
然后:
您在此处显示的文档实际上并不是 Terraform 函数要解析的通常意义上的 CSV 文档,这是RFC 4180中定义的格式。您的第二个“字段”似乎是一个 JSON 文档,内部有自己的字段(包括逗号),这意味着
csvdecode
会误解该文档的含义。相反,我认为这是一种自定义格式,因此使用更简单的原语来解析它:
上面混合使用了不同的 Terraform 函数将文件内容分割成更小的标记:
split
将整个内容拆分为单独的行(以chomp
处理 Windows 风格的行结尾的可能性,这将是\r\n
而不是只是\n
,因此之后需要额外的剥离。)slice
丢弃第一行,即“标题”行。regex
以忽略“值”字段中额外的逗号和引号的方式分隔“id”和“值”字段。jsondecode
使用 JSON 语法将“values”字符串替换为它所描述的对象。我将其分为多个步骤,以便更轻松地查看中间步骤的结果,但如果您愿意,您应该能够将其中至少一些步骤组合成更大的表达式。
毕竟,
local.custom_data
应该是一个可以与 一起使用的数据结构for_each
,形状如下:如果您确实想将其视为常规 CSV 文档并使用
csvdecode
,那么您需要首先更改“值”字段的编码以转义引号和逗号,这意味着:"
,如 RFC 4180 第 2 节第 6 项中所述。""
而不是仅仅"
)进行转义,如 RFC 4180 第 2 部分第 7 项中所述。如果原则上可以使用 Terraform 本身执行该转换,但它与我上面展示的低级解析大致相同,首先分别标记 id 和 value 字段,所以我不会采取此选项,除非我可以更改生成原始文档的任何系统以生成有效的 CSV 数据本身,以便 Terraform 可以仅依赖于
csvdecode
.