Замена пробелов значениями NULL путем сравнения двух файлов CSV с использованием python - PullRequest
0 голосов
/ 26 февраля 2019

Скажите, что у меня есть два файла CSV:

csvfile1:

name      Dept  City      
sree,     CSE,  Bengaluru,  
vatsasa,  ECE,  Hyd,      
          IT,   VJA,      
capini,   Mech, TPTY,   
DTP,      Civil,kandra
Bengaluru,ECM,  TVM,      
sre,      ECS,  MNGL,   
vatsas,         Kochi,    
          Nano, TVM,      
capmin,         Tech,       
DTP9,     CSS,  Kochi,    
          ESS,  TVM,    
sree0,    RSS,  MNGL,   

csvfile2:

name, Dept, City, Address

Я хотел бы проверить всестолбцы csvfile2 присутствуют в csvfile1.

  1. При наличии проверьте, содержит ли какой-либо из столбцов в csvfile1 пробелы.Если пробелы присутствуют, замените пробелы значением NULL и запишите все столбцы в новый CSV-файл csvfile3 по столбцам.

  2. Если их нет, напишите пропущенныестолбцы вместе с существующими до csvfile3.Кроме того, значения этих пропущенных столбцов должны быть показаны как NULL в csvfile3, а пробелы в существующих столбцах следует заменить на NULL

Ниже приведен ожидаемый результат:

name      Dept  City      Address
sree,     CSE,  Bengaluru,NULL
vatsasa,  ECE,  Hyd,      NULL
NULL,     IT,   VJA,      NULL
capini,   NULL, Mech,     NULL
DTP,      Civil,NULL,     NULL
Bengaluru,ECM,  TVM,      NULL
sre,      ECS,  MNGL,     NULL
vatsas,   NULL, Kochi,    NULL
NULL,     Nano, TVM,      NULL
capmin,   NULL, Tech,     NULL
DTP9,     CSS,  Kochi,    NULL
NULL,     ESS,  TVM,      NULL
sree0,    RSS,  MNGL,     NULL

Я написал следующий код:

f=open('csvfile2.csv', 'r')
g=csv.reader(f)
first=next(g, None)
print('lenght of first list', len(first))
f1=open('csvfile1.csv','r')
h=csv.reader(f1)
second=next(h,None)
print('lenght of first list', len(second))
f2=open('csvfile3', 'w')
writer=csv.writer(f2)
count=0
if len(second) < len(first):
    for i in first:
        if not i in second:
            for count in range:
                writer.writerows('Null')
                print('null')
        else:
            ind=second.index(i)
                for j in second:
                    if not j[ind]:
                        writer.writerows(j[ind].replace(' ','Null'))                            
                    else:
                        writer.writerows(j[ind])

Вывод вышеуказанного кода:

name, Dept, City, Address
N
U
L
L
N
U
L
L
N
U
L
L
N
U
L
L
N
U
L
L

Я написал код для экземпляра AWS EC2 и планируюиспользуйте то же самое для AWS Lambda тоже.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Если вы не хотите использовать pandas, вот решение, использующее csv:

import csv

with open("csvfile1.csv") as csv_1,\
     open("csvfile2.csv") as csv_2,\
     open("csvfile3.csv", "w") as csv_3:

    reader_1 = csv.reader(csv_1)
    reader_2 = csv.reader(csv_2)
    writer = csv.writer(csv_3)

    headers_1 = next(reader_1)
    headers_2 = next(reader_2)

    insert_null_at = []
    for i, header in enumerate(headers_2):
        if header not in headers_1:
            insert_null_at.append(i)

    writer.writerow(headers_2)
    for row in reader_1:
        for i in insert_null_at:
            row.insert(i, "")

        writer.writerow([item if item != "" else "NULL" for item in row])

Как обсуждалось выше, предполагается, что формат csvfile1 на самом деле:

name,Dept,City
sree,CSE,Bengaluru
vatsasa,ECE,Hyd
,IT,VJA
capini,Mech,TPTY
DTP,Civil,kandra
Bengaluru,ECM,TVM
sre,ECS,MNGL
vatsas,,Kochi
,Nano,TVM
capmin,,Tech
DTP9,CSS,Kochi
,ESS,TVM
sree0,RSS,MNGL
0 голосов
/ 26 февраля 2019

Для прямой работы с CSV-файлами может быть очень сложно.Я бы предложил использовать панд, которые работают с табличной структурой данных, потому что она очень эффективна и минимизирует код.

Пример кода:

import pandas as pd 

# READ BOTH FILES AS TABULAR DATA STRUCTURE
# PROVIDE FILE PATH
csv_file_one = pd.read_csv("csv_file_one.csv")
csv_file_two = pd.read_csv("csv_file_two.csv")

# REPLACE EMPTY VALUES WITH NULL IN CSV ONE
csv_file_one.fillna(value='NULL', inplace=True)

header_of_csv_two = list(csv_file_two.columns.values)

# IF CSV FILE ONE DOESN'T HAS COLUMN
# OF CSV TWO, THEN IT WILL CREATE THAT
# WITH NULL VALUES
for each_col in header_of_csv_two:
    if each_col not in csv_file_one.columns:
        csv_file_one[each_col] = 'NULL'

# WRITING TO CSV
# PROVIDE FILE PATH
csv_file_one.to_csv("csv_file_three.csv", index=False)

Пример вывода:

name      dept       city  address
ram        NULL  kathmandu    NULL
kiran  computer       NULL    NULL
kumar     civil      patan    NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...