将多个 YAML 文件转换为 CSV [英] Convert several YAML files to CSV

查看:46
本文介绍了将多个 YAML 文件转换为 CSV的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我对 Python 非常陌生,有几个 YAML 文件需要转换为 csv.这些是来自我们的 CRM (Highrise) 的笔记、评论和电子邮件.我只需要注释和评论,不需要电子邮件.以下是一些示例.

I am very new to Python and have several YAML files that I need to convert into csv. These are notes, comments and emails that came from our CRM (Highrise). I ONLY need the Notes and Comments, not the emails. Here are a few examples.

Test_Co_1.txt

Test_Co_1.txt

---
- ID: 273679215
  Name: Test Company 1
  Tags: 
  - Sample tag 1
  - Sample tag 2
  - Sample tag 3
  - Sample tag 4
- Contact: 
  - 
    - Addresses
    - 
      - "123 W Elm Street, Anywhere, FL, 11111, United States"
  - 
    - Phone_numbers
    - 
      - 555-111-2222
- Background: sample text
- Note 424169327: 
  - 
    Author: Diane S.
  - 
    Written: "May 16, 2017 19:32"
  - 
    About: Jeff Smith
  - 
    Body: Called 5/16/17 - Receptionist indicated Jeff was unavailable. She said they are not interested in attending any webinars hung up.
- Note 424598243: 
  - 
    Author: Jenny S.
  - 
    Written: "May 18, 2017 15:45"
  - 
    About: Test Company 1
  - 
    Body: |-
      email sent to TM: Pete

      Pete,

      Can you help us with this prospective customer to determine if he is interested?

      We made some outbound calls this week, inviting dealers to the prospective dealer Summer Series webinars, with the first one being this Friday.  Can you see if Jeff is interested?  We do not have an email for him.  Do you have that?

      This is the note from earlier this week:
      Called 5/16/17 - Receptionist indicated Jeff was unavailable. She said they are not interested in attending any webinars hung up.

      Thanks for your help.
      photo

      Jenny
- Comment 424601588: 
  - 
    Author: Jenny S.
  - 
    Written: "May 18, 2017 15:56"
  - 
    About: Test Company 1
  - 
    Body: |-
      email back from TM: Jenny,

      Yes.  I will reach out to them. 

      Thanks!
      Pete

另一个例子:Fake_Co_2

Another Example: Fake_Co_2

---
- ID: 306184746
  Name: Fake Company 2
  Tags: 
  - Sample Tag 1
- Contact: 
  - 
    - Addresses
    - 
      - "444 N Oak St, Faketon City, MI, 22222, United States"
  - 
    - Phone_numbers
    - 
      - 333-333-3333
- Note 473905168: 
  - 
    Author: Robin S.
  - 
    Written: "February 20, 2018 22:19"
  - 
    About: Fake Company 2
  - 
    Body: "1:1 with Steven 2/27/18"
- Email 476444812: 
  - 
    Author: Aaron N.
  - 
    Written: "March 06, 2018 16:30"
  - 
    About: Jose Viago
  - 
    Subject: Welcome Call
  - 
    Body: |-
      Hello Jose,



      We just talked and we scheduled your welcome call.  I noticed after we hung
      up that time changes this weekend.  Unfortunately Arizona
      doesn't change time and we will now be 2 hours behind you.  Are you
      available on at 10:30 AM CST on Tuesday, March 13th?  Otherwise I will need
      to schedule at a different time.  



      I apologize for the error and inconvenience. 




       <http://fakedomain.com/> 

      Support Team Lead 
      D: xxx-xxx-xxxx | C: xxx-xxx-xxxx | F: xxx-xxx-xxxx 
       <mailto:noreply@fakedomain.com> noreply@fakedomain.com 




       <http://fakedomain.com/> Website |
      <https://www.youtube.com/watch?v=xxx> Our Story


      Confidentiality Disclaimer: This email may contain confidential and/or
      private 
      information. If you received this email in error please delete and notify
      sender.
- Note 476458623: 
  - 
    Author: Jamie H.
  - 
    Written: "March 06, 2018 17:12"
  - 
    About: Fake Company 2
  - 
    Body: ""
- Note 476460268: 
  - 
    Author: Aaron N.
  - 
    Written: "March 06, 2018 17:18"
  - 
    About: Fake Company 2
  - 
    Body: |-
      Called and talked to Jose and scheduled the Welcome Call for Tuesday, March 13 at 9:30 AM.  After I hung up I realized that time changes this weekend.  I left him a voice mail and emailed to see if doing the appointment at 10:30 AM would be ok.  

      Prep for appointment: Monday, March 12 at 2:30 PM 
      Welcome Call: Tuesday, March 13 at 10:30 AM CST

      Jose emailed back and said that 10:30 is fine.  

      Michael H has been scheduled
- Comment 476460532: 
  - 
    Author: Aaron N.
  - 
    Written: "March 06, 2018 17:18"
  - 
    About: Jose Viago
  - 
    Body: |-
      From: Jose Viago [mailto:fakecompany2@gmail.com] 
      Sent: Tuesday, March 6, 2018 10:01 AM
      To: admin@fakecompany.com
      Subject: Re: Welcome Call

      Yes that is fine.  Thank you! 
      Jose Viago
      Fake Company 2
      xxx-xxx-xxxx
- Note 477585004: 
  - 
    Author: Laura H.
  - 
    Written: "March 12, 2018 23:46"
  - 
    About: Fake Company 2
  - 
    Body: |-
      Welcome call prep complete. Roadmap & workbook have been saved to their profile in BOX, and updated per their provided information. 
      03/12/18 (LH)
- Note 477740716: 
  - 
    Author: Michael H.
  - 
    Written: "March 13, 2018 16:47"
  - 
    About: Fake Company 2
  - 
    Body: |-
      03-13-2018. Did a welcome call with Jose. Jose now has access to the box. We will have a follow up call for Dashboard roll out.

      03-13-2018. Did a follow up with Jose. He now has owner and tech role to the App and Dashboard. We also reviewed Online portal and help center. (MH)
- Note 502997603: 
  - 
    Author: Laura H.
  - 
    Written: "August 06, 2018 17:14"
  - 
    About: Fake Company 2
  - 
    Body: |-
      Received a text from Jose letting me know there is a leak in his office, and he needs to reschedule our call today. I moved him to Thursday 08/09/18 @ 9:00AM CDT. 
      08/06/18 (LH)

其中一些文本文件长达 1000 行,包含为该特定客户(或为该客户工作的联系人)记录的所有内部注释、评论和电子邮件.

Some of these text files are 1000's of lines long, containing every internal note, comment, and email ever recorded for that specific customer (or contact that works for that customer).

我们正在迁移到不同的 CRM,只需导入备注和评论.我想像这样生成一个 csv(或多个 csv 文件,如果需要):

We are moving to a different CRM and need to import the Notes and Comments only. I would like to generate a csv (or multiple csv files if needed) like this:

输出.csv

Name,Author,Written,About,Body
"Fake Company 2"|"Robin S."|"February 20, 2018 22:19"|"Fake Company 2"|"1:1 with Steve 2/27/18"
"Fake Company 2"|"Aaron N."|"March 06, 2018 17:18"|"Fake Company 2"|"Called and talked to Jose and scheduled the Welcome Call for Tuesday, March 13 at 9:30 AM.  After I hung up I realized that time changes this weekend.  I left him a voice mail and emailed to see if doing the appointment at 10:30 AM would be ok.  

      Prep for appointment: Monday, March 12 at 2:30 PM 
      Welcome Call: Tuesday, March 13 at 10:30 AM CST

      Jose emailed back and said that 10:30 is fine.  

      Michael H has been scheduled"

我找到了这个代码 需要一个从 yaml 文件内容中提取并输出为 csv 文件的脚本,但我对 Python 的了解不够,无法让它在没有语法错误的情况下正常工作.

I found this code Need a script that extracts from a yaml file content and output as a csv file but I do not know enough about Python to get it to work without syntax errors.

推荐答案

我会使用 Python YAML 库来帮助完成这项工作.这可以使用以下方法安装:

I would make use of a Python YAML library to help with doing that. This could be installed using:

pip install pyyaml

您提供的文件可以按如下方式转换为 CSV:

The files you have given could then be converted to CSV as follows:

import csv
import yaml

fieldnames = ['Name', 'Author', 'Written', 'About', 'Body']

with open('output.csv', 'w', newline='') as f_output:
    csv_output = csv.DictWriter(f_output, fieldnames=fieldnames)
    csv_output.writeheader()

    for filename in ['Test_Co_1.txt', 'Test_Co_2.txt']:
        with open(filename) as f_input:
            data = yaml.safe_load(f_input)

        name = data[0]['Name']

        for entry in data:
            key = next(iter(entry))

            if key.startswith('Note') or key.startswith('Comment'):
                row = {'Name' : name}

                for d in entry[key]:
                    for get in ['Author', 'Written', 'About', 'Body']:
                        try:
                            row[get] = d[get]
                        except KeyError as e:
                            pass

                csv_output.writerow(row)

这假定采用标准 CSV 格式(即,如果字段包含换行符或逗号,则在字段和引号之间使用逗号).

This assumes a standard CSV format (i.e. commas between fields and quotes are used if a field contains a newline or commas).

要理解这一点,我建议您添加一些打印语句以查看内容.例如,data 以列表和字典的格式保存整个文件内容.然后是提取您需要的位的情况.

To understand this, I would recommend you add some print statements to see what things look like. For example data holds then entire file contents in a format of lists and dictionaries. It is then a case of extracting the bits you need.

要将其应用于所有 YAML 文件,我将使用对 glob.glob('*.txt')

To apply this to all of your YAML files, I would replacing the filenames with a call to glob.glob('*.txt')

这篇关于将多个 YAML 文件转换为 CSV的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆