AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 76946539
Accepted
João Pedro Schmitt
João Pedro Schmitt
Asked: 2023-08-21 23:00:09 +0800 CST2023-08-21 23:00:09 +0800 CST 2023-08-21 23:00:09 +0800 CST

Como ler valores de string entre aspas duplas usando terraform csvdecode?

  • 772

Eu tenho um arquivo CSV que contém o seguinte conteúdo:

id,value
123,{"M":{"name_1":{"S":"value_1"}, "name_2":{"S":"value_2"}}}

Estou tentando ler esse arquivo CSV e criar registros no DynamoDB da seguinte forma:

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]
  }
}

No entanto, esse código não funciona e não consigo encontrar nenhum exemplo de como ler os valores entre aspas duplas do arquivo CSV de uma forma que jsondecodepossa criar a estrutura JSON apropriada. Alguém sabe como fazer isso?

csv
  • 2 2 respostas
  • 18 Views

2 respostas

  • Voted
  1. Best Answer
    Paolo
    2023-08-21T23:21:28+08:002023-08-21T23:21:28+08:00

    Higienize seu arquivo csv:

    id,value
    123,"{""M"":{""name_1"":{""S"":""value_1""}, ""name_2"":{""S"":""value_2""}}}"
    

    então:

    $ terraform-repl
    > csvdecode(file("${path.module}/custom_data.csv"))
    tolist([
      {
        "id" = "123"
        "value" = "{\"M\":{\"name_1\":{\"S\":\"value_1\"}, \"name_2\":{\"S\":\"value_2\"}}}"
      },
    ])
    
    > jsondecode(csvdecode(file("${path.module}/custom_data.csv"))[0].value)
    {
      "M" = {
        "name_1" = {
          "S" = "value_1"
        }
        "name_2" = {
          "S" = "value_2"
        }
      }
    }
    
    • 2
  2. Martin Atkins
    2023-08-21T23:52:18+08:002023-08-21T23:52:18+08:00

    O documento que você mostrou aqui não é realmente um documento CSV no sentido usual que a função do Terraform pretende analisar, que é o formato definido em RFC 4180 . Seu segundo "campo" parece ser um documento JSON com seus próprios campos, incluindo vírgulas, o que significa que você csvdecodenão entenderá o que este documento pretende significar.

    Em vez disso, consideraria este um formato personalizado e o analisaria usando primitivos mais simples:

    locals {
      custom_data_raw = file("${path.module}/../custom_data.csv")
      custom_data_lines = slice([
        for chunk in split("\n", local.custom_data_raw) : chomp(chunk)
      ], 1, length(local.custom_data_raw))
      custom_data_fields = [
        for line in local.custom_data_lines : regex("^(?P<id>[^,]),(?P<values>.*)$", line)
      ]
      custom_data = {
        for fields in local.custom_data_fields :
        fields.id => jsondecode(fields.value)
      }
    }
    

    O texto acima usa uma mistura de diferentes funções do Terraform para dividir o conteúdo do arquivo em tokens menores:

    • splitpara dividir todo o conteúdo em linhas individuais (para chomplidar com a possibilidade de finais de linha no estilo do Windows, que seriam \r\nem vez de apenas \ne, portanto, precisariam de remoção extra posteriormente).
    • slicepara descartar a primeira linha, que é a linha de "cabeçalho".
    • regexpara separar os campos "id" e "valores" de uma forma que ignore as vírgulas e aspas extras no campo "valores".
    • Finalmente, jsondecodesubstitua a string "valores" pelo objeto que ela está descrevendo usando a sintaxe JSON.

    Dividi isso em várias etapas para facilitar a visualização dos resultados das etapas intermediárias, mas você poderá combinar pelo menos algumas dessas etapas em expressões maiores, se preferir.

    Depois de tudo isso, local.custom_datadeve haver uma estrutura de dados que você possa usar for_each, com o seguinte formato:

    {
      "123" = {
        "M" = {
          "name_1" = {
            "S" = "value_1"
          }
          "name_2" = {
            "S" = "value_2"
          }
        }
      }
    }
    
    resource "aws_dynamodb_table_item" "custom_table_item" {
      for_each = local.custom_data
    
      table_name = aws_dynamodb_table.custom_table.name
      hash_key   = aws_dynamodb_table.custom_table.hash_key
    
      item = jsonencode({
        "id" : { "S" : each.key },
        "value" : each.values
      })
    
      lifecycle {
        ignore_changes = [item]
      }
    }
    

    Se você quiser tratar isso como um documento CSV normal e usá-lo, csvdecodeprimeiro você precisará alterar a codificação dos campos "valor" para escapar das aspas e vírgulas, o que significa:

    • Escrever toda a string JSON no segundo argumento entre aspas ", conforme descrito na RFC 4180 seção 2 item 6.
    • Escrever aspas literais dentro do seu documento JSON como escapadas por duplicação ( ""em vez de apenas "), conforme descrito na seção 2, item 7, da RFC 4180.

    Em princípio, seria possível realizar essa transformação usando o próprio Terraform, mas seria basicamente o mesmo que a análise de nível inferior que mostrei acima para primeiro tokenizar os campos id e valor separadamente, então eu não escolheria esta opção a menos que eu pode alterar qualquer sistema que esteja gerando o documento original para produzir dados CSV válidos, de modo que o Terraform possa contar apenas com arquivos csvdecode.

    • 1

relate perguntas

  • Arquivo BAT - Renomeie vários arquivos .csv de acordo com o conteúdo do arquivo

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    destaque o código em HTML usando <font color="#xxx">

    • 2 respostas
  • Marko Smith

    Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}?

    • 1 respostas
  • Marko Smith

    Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)?

    • 2 respostas
  • Marko Smith

    Por que as compreensões de lista criam uma função internamente?

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Marko Smith

    java.lang.NoSuchMethodError: 'void org.openqa.selenium.remote.http.ClientConfig.<init>(java.net.URI, java.time.Duration, java.time.Duratio

    • 3 respostas
  • Marko Smith

    Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)?

    • 4 respostas
  • Marko Smith

    Por que o construtor de uma variável global não é chamado em uma biblioteca?

    • 1 respostas
  • Marko Smith

    Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto?

    • 1 respostas
  • Marko Smith

    Somente operações bit a bit para std::byte em C++ 17?

    • 1 respostas
  • Martin Hope
    fbrereto Por que a resolução de sobrecarga prefere std::nullptr_t a uma classe ao passar {}? 2023-12-21 00:31:04 +0800 CST
  • Martin Hope
    比尔盖子 Você pode usar uma lista de inicialização com chaves como argumento de modelo (padrão)? 2023-12-17 10:02:06 +0800 CST
  • Martin Hope
    Amir reza Riahi Por que as compreensões de lista criam uma função internamente? 2023-11-16 20:53:19 +0800 CST
  • Martin Hope
    Michael A formato fmt %H:%M:%S sem decimais 2023-11-11 01:13:05 +0800 CST
  • Martin Hope
    God I Hate Python std::views::filter do C++20 não filtrando a visualização corretamente 2023-08-27 18:40:35 +0800 CST
  • Martin Hope
    LiDa Cute Por que 'char -> int' é promoção, mas 'char -> short' é conversão (mas não promoção)? 2023-08-24 20:46:59 +0800 CST
  • Martin Hope
    jabaa Por que o construtor de uma variável global não é chamado em uma biblioteca? 2023-08-18 07:15:20 +0800 CST
  • Martin Hope
    Panagiotis Syskakis Comportamento inconsistente de std::common_reference_with em tuplas. Qual é correto? 2023-08-17 21:24:06 +0800 CST
  • Martin Hope
    Alex Guteniev Por que os compiladores perdem a vetorização aqui? 2023-08-17 18:58:07 +0800 CST
  • Martin Hope
    wimalopaan Somente operações bit a bit para std::byte em C++ 17? 2023-08-17 17:13:58 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve