list - 如何将列表转换为带有标题和相应值的 CSV 文本文件?

标签 list csv dictionary ansible

我有一个变量 data_list,但它最终全部位于一行中,分布在 CSV 文本文件中的多个单元格中:

[{"FirstName": "Peter", "AliasName": "", "Code": "#3091", "DateofSubmission": "14/5/2023", "Description": "NIL", "path": "OU=fulltime,OU=Test OU,DC=localdemo,DC=local"}, {"FirstName": "Sam", "AliasName": "", "Code": "#3092", "DateofSubmission": "2/5/2023", "Description": "NIL", "path": "OU=parttime,OU=Test OU,DC=localdemo,DC=local"}, {"FirstName": "Judy", "AliasName": "", "Code": "#3093", "DateofSubmission": "10/5/2023", "Description": "NIL","path": "OU=flexi,OU=Test OU,DC=localdemo,DC=local"}]

Playbook版本调试数据列表:

    - debug:
        var: data_list
    "data_list": [
        {
            "AliasName": "",
            "Code": "#3091",
            "DateofSubmission": "14/5/2023",
            "Description": "NIL",
            "FirstName": "Peter",
            "path": "OU=fulltime,OU=Test OU,DC=localdemo,DC=local" 
        },
        {
            "AliasName": "",
            "Code": "#3092",
            "DateofSubmission": "2/5/2023",
            "Description": "NIL",
            "FirstName": "Sam",
            "path": "OU=parttime,OU=Test OU,DC=localdemo,DC=local"
        },
        {
            "AliasName": "",
            "Code": "#3093",
            "DateofSubmission": "10/5/2023",
            "Description": "NIL",
            "FirstName": "Judy",
            "path": "OU=flexi,OU=Test OU,DC=localdemo,DC=local" 
        }
    ]
}

我需要什么代码才能将 data_list 转换为带有标题及其相应值的 CSV 文件,如下所示?

FirstName , Alias Name , Code, Date of Submission, Description, path  
Peter,,#3091,14/5/2023,NIL,"OU=fulltime,OU=TestOU,DC=localdemo,DC=local"
Sam,,#3092,2/5/2023,2/5/2023,NIL,"OU=parttime,OU=TestOU,DC=localdemo,DC=local"
Judy,,#3093,10/5/2023,NIL,"OU=flexi,OU=Test OU,DC=localdemo,DC=local" 

更新(Blitzden 评论)

这是我调试模板时得到的结果:

FirstName,Alias Name,Code,Date of Submission,Description,path\n
Peter,,#3091,14/5/2023,NIL,\"OU=fulltime,OU=Test OU,DC=localdemo,DC=local\"
Sam,,#3092,2/5/2023,NIL,\"OU=parttime,OU=Test OU,DC=localdemo,DC=local\"
Judy,,#3093,10/5/2023,NIL,\"OU=flexi,OU=Test OU,DC=localdemo,DC=local\"\n

最佳答案

声明转换

  label:
    FirstName: FirstName
    Alias Name: AliasName
    Code: Code
    Date of Submission: DateofSubmission
    Description: Description
    path: path
  • 当您使用逗号“,”之外的其他分隔符时,模板相当简单
    - debug:
        msg: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {{ _keys|map('extract', data)|join(delimiter) }}
          {% endfor %}
      vars:
        delimiter: ';'

给出

  msg: |-
    FirstName;Alias Name;Code;Date of Submission;Description;path
    Peter;;#3091;14/5/2023;NIL;OU=fulltime,OU=Test OU,DC=localdemo,DC=local
    Sam;;#3092;2/5/2023;NIL;OU=parttime,OU=Test OU,DC=localdemo,DC=local
    Judy;;#3093;10/5/2023;NIL;OU=flexi,OU=Test OU,DC=localdemo,DC=local
  • 如果使用逗号“,”作为分隔符,则必须引用属性路径。例如,
    - debug:
        msg: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {% for k in _keys %}
          {% if k in quote_list %}
          "{{ data[k] }}"{% if not loop.last %}{{ delimiter }}{% endif %}
          {% else %}
          {{ data[k] }}{% if not loop.last %}{{ delimiter }}{% endif %}
          {% endif %}
          {% endfor %}

          {% endfor %}
      vars:
        delimiter: ','
        quote_list: [path]

给出

  msg: |-
    FirstName,Alias Name,Code,Date of Submission,Description,path
    Peter,,#3091,14/5/2023,NIL,"OU=fulltime,OU=Test OU,DC=localdemo,DC=local"
    Sam,,#3092,2/5/2023,NIL,"OU=parttime,OU=Test OU,DC=localdemo,DC=local"
    Judy,,#3093,10/5/2023,NIL,"OU=flexi,OU=Test OU,DC=localdemo,DC=local"
  • 将 CSV 数据写入文件
    - copy:
        dest: /tmp/test.csv
        content: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {% for k in _keys %}
          {% if k in quote_list %}
          "{{ data[k] }}"{% if not loop.last %}{{ delimiter }}{% endif %}
          {% else %}
          {{ data[k] }}{% if not loop.last %}{{ delimiter }}{% endif %}
          {% endif %}
          {% endfor %}

          {% endfor %}
      vars:
        delimiter: ','
        quote_list: [path]

给出

shell> cat /tmp/test.csv
FirstName,Alias Name,Code,Date of Submission,Description,path
Peter,,#3091,14/5/2023,NIL,"OU=fulltime,OU=Test OU,DC=localdemo,DC=local"
Sam,,#3092,2/5/2023,NIL,"OU=parttime,OU=Test OU,DC=localdemo,DC=local"
Judy,,#3093,10/5/2023,NIL,"OU=flexi,OU=Test OU,DC=localdemo,DC=local"

用于测试的完整剧本示例

- hosts: localhost

  vars:

    data_list:
      - AliasName: ''
        Code: '#3091'
        DateofSubmission: 14/5/2023
        Description: NIL
        FirstName: Peter
        path: OU=fulltime,OU=Test OU,DC=localdemo,DC=local
      - AliasName: ''
        Code: '#3092'
        DateofSubmission: 2/5/2023
        Description: NIL
        FirstName: Sam
        path: OU=parttime,OU=Test OU,DC=localdemo,DC=local
      - AliasName: ''
        Code: '#3093'
        DateofSubmission: 10/5/2023
        Description: NIL
        FirstName: Judy
        path: OU=flexi,OU=Test OU,DC=localdemo,DC=local

    label:
      FirstName: FirstName
      Alias Name: AliasName
      Code: Code
      Date of Submission: DateofSubmission
      Description: Description
      path: path

  tasks:

    - debug:
        msg: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {{ _keys|map('extract', data)|join(delimiter) }}
          {% endfor %}
      vars:
        delimiter: ';'

    - debug:
        msg: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {% for k in _keys %}
          {% if k in quote_list %}
          "{{ data[k] }}"{% if not loop.last %}{{ delimiter }}{% endif %}
          {% else %}
          {{ data[k] }}{% if not loop.last %}{{ delimiter }}{% endif %}
          {% endif %}
          {% endfor %}

          {% endfor %}
      vars:
        delimiter: ','
        quote_list: [path]
        
    - copy:
        dest: /tmp/test.csv
        content: |
          {{ label.keys()|join(delimiter) }}
          {% set _keys=label.values()|list %}
          {% for data in data_list %}
          {% for k in _keys %}
          {% if k in quote_list %}
          "{{ data[k] }}"{% if not loop.last %}{{ delimiter }}{% endif %}
          {% else %}
          {{ data[k] }}{% if not loop.last %}{{ delimiter }}{% endif %}
          {% endif %}
          {% endfor %}

          {% endfor %}
      vars:
        delimiter: ','
        quote_list: [path]

关于list - 如何将列表转换为带有标题和相应值的 CSV 文本文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76438705/

相关文章:

python - 使用最大和给定跨度的最佳解析树

python - Python 可以让列表更高效吗?

java - 列表、基本类型和性能

python - 在python中将列表保存为带有两位小数的csv?

javascript - 从重复的 javascript 数组结果集中仅获取一行

python - 如何在python3中对字典元素进行分组

c++ - 使用迭代器在 vector 中插入下一个值以进行映射

python-3.x - 如何从两个不同的列表中删除重复项?

c# - 按列表中的多个项目进行分组,然后求和并平均 C#

csv - Tensorflow 如何将 csv 文件中的单词(字符串)转换为正确的向量