我有一个变量 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/