我对Python还是很陌生,有几个需要转换为csv的YAML文件。这些是来自我们的CRM(高层)的注释,评论和电子邮件。我只需要注释和注释,而不是电子邮件。这是一些示例。
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
---
- 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行,其中包含曾经为该特定客户(或对该客户有效的联系人)记录的所有内部注释,评论和电子邮件。
我们正在转移到其他CRM,仅需要导入注释和注释。我想这样生成一个csv(或多个csv文件):
output.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"
我找到了这段代码Need a script that extracts from a yaml file content and output as a csv file,但我对Python的了解还不足以使其在没有语法错误的情况下正常工作。
答案 0 :(得分:1)
我将利用Python YAML库来帮助实现此目的。可以使用以下方式安装:
pip install pyyaml
您所提供的文件可以如下转换为CSV:
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格式(即,如果字段包含换行符或逗号,则在字段和引号之间使用逗号)。
要了解这一点,我建议您添加一些打印语句以查看外观。例如,data
然后以列表和字典的格式保存整个文件内容。然后就是提取所需位的情况。
要将其应用于您的所有YAML文件,我将用调用glob.glob('*.txt')