Я пытаюсь преобразовать текстовый файл в CSV в Python - PullRequest
1 голос
/ 18 апреля 2019

Я пытаюсь преобразовать текстовый файл в CSV в Python Входной текстовый файл выглядит следующим образом:

Employee Name: Dr.john doe
Designation: Professor
Email: johndoe@google.com
"ContactNo: 1234567, 9999999"
"Qualification: M.Tech., Ph.D."
Area of Interest / Specialisation: network security
Employee Name: Dr. john doe2 
Designation: Professor2
Email: johndoe2@google.com
ContactNo: 222222222
"Qualification: B.Tech., Ph.D."
Area of Interest / Specialisation: network security2
Employee Name: Dr. john doe3 
Designation: Associate Professor3
Email: johndoe3@google.com
"ContactNo: 333333,4444444"
Qualification: Ph.D.
Area of Interest / Specialisation: network security3
Designation: Associate Professor4
Email: johndoe4@google.com
"ContactNo: 44444444 ,Intercom No.44444"
Qualification: : M.Sc. 
Designation: Programmer
Email: johndoe5@google.com
"ContactNo: 5555555555 ,Intercom No.5555"
Qualification: Ph.D |Computer Science
Designation: Computer Operator
Email: johndoe6@google.com
ContactNo: 666666666
"Qualification: D.C.Sc. & E.,"
Designation: Computer Operator
Email: johndoe7@google.com
"ContactNo: 777777777 ,Intercom No.77777<"
"Qualification: D.E & TC.,"
Designation: Instructor4
Email: johndoe8@google.com
"ContactNo: 8888888888 ,Intercom No.8888"
"Qualification: D.C.Sc. & E.,"`

Мне нужно это в CSV в следующем формате (как вы можете видеть, можно взять только одно из нескольких значений для поля, и есть некоторые данные без имени сотрудника, которые необходимо исключить в выходном CSV-файле):

name,designation,email,contact,Qualification,Specialisation 

Dr. john doe,Professor,johndoe@google.com,1234567,B.E.,network security

Dr. john doe2,Professor,johndoe2@google.com,222222222,M.S.,network security2

Dr. john doe3,Associate,Professor3,johndoe3@gmail.com,333333,M.Tech.,network security3

** Я пробовал разные способы, но я не в состоянии это сделать (я совершенно новичок в программировании):

используя другие примеры, я пробовал это, но я думаю, что мой вопрос требует другого подхода:

records = """Employee Name: Dr. john doe
Designation: Professor
Email: johndoe@google.com
ContactNo: 1234567, 9999999
Qualification: M.Tech., Ph.D.
Area of Interest / Specialisation: network security"""

for record in records.split('Employee Name'):
    fields = record.split('\n')
    Employee_Name = "NA"
    Designation = "NA"
    ContactNo = "NA"
    Qualification = "NA"
    Specialization = "NA"
    for field in fields:
        field_name, field_value = field.split(':')
        if field_name == "": # This is employee name, since we split on it
            Employee_Name = field_value
        if field_name == "Designation":
            Designation = field_value
        if field_name == "ContactNo":
            ContactNo = field_value
        if field_name == "Qualification":
            Qualification = field_value
        if field_name == "Specialization":
            Specialization = field_value

это мой первый вопрос здесь, поэтому, пожалуйста, игнорируйте любые ошибки форматирования в вопросе (ПОЖАЛУЙСТА, НЕ ЗАДЕРЖИВАЙТЕ вопрос, если что-то не так, я обновлю его немедленно)

Ответы [ 2 ]

1 голос
/ 19 апреля 2019

Если вы добавите операторы печати в разных местах кода, вы обнаружите, что иногда record='', а иногда field=''.

Добавьте пару строк:

for record in records.split('Employee Name'):
    if record == '':
        continue
    fields = record.split('\n')

и

for field in fields:
    if field == '':
        continue
    field_name, field_value = field.split(':')

Теперь это должно успешно выполняться.

0 голосов
/ 22 апреля 2019

Данные

Employee Name: Dr.john doe
Designation: Professor
Email: johndoe@google.com
"ContactNo: 1234567, 9999999"
"Qualification: M.Tech., Ph.D."
Area of Interest / Specialisation: network security
Employee Name: Dr. john doe2 
Designation: Professor2
Email: johndoe2@google.com
ContactNo: 222222222
"Qualification: B.Tech., Ph.D."
Area of Interest / Specialisation: network security2
Employee Name: Dr. john doe3 
Designation: Associate Professor3
Email: johndoe3@google.com
"ContactNo: 333333,4444444"
Qualification: Ph.D.
Area of Interest / Specialisation: network security3

Вот простой метод , который также применим, если имеется много столбцов (нет необходимости писать коддля каждого поля)

Решение:

import pandas as pd
tdf = pd.read_csv("D:/emp.txt",sep='\n',doublequote=False, header= None)

tdf = tdf[0].str.split(':', expand=True)

dd = tdf.groupby(0)[1].apply(lambda g: g.values.tolist()).to_dict()

df = pd.DataFrame.from_dict(dd)

# If you want to re-arrange the columns (Optional)
df = df[['Employee Name','Designation','Email','ContactNo','Qualification','Area of Interest / Specialisation']]

df.to_csv('D:/EMP.csv',index=False) #Save results in CSV format

df

     Employee Name            Designation                 Email          ContactNo    Qualification Area of Interest / Specialisation
0      Dr.john doe              Professor    johndoe@google.com   1234567, 9999999   M.Tech., Ph.D.                  network security
1   Dr. john doe2              Professor2   johndoe2@google.com          222222222   B.Tech., Ph.D.                 network security2
2   Dr. john doe3    Associate Professor3   johndoe3@google.com     333333,4444444            Ph.D.                 network security3
...