Mam dwa pliki:

Pierwszy zwany plik 1: date,name,age

Drugi zwany plik 2: date,name,age

Oto przykład:

file1.csv:

2015/1/2,Jina,17
2015/1/3,JJ,25
2015/1/4,Carole,8

file2.csv:

2015/1/1,Rouba,14
2015/1/2,GG,78
2015/1/3,James,7
2015/1/4,Elie,15

Muszę dołączyć do dwóch plików z taką samą datą dla tego przykładu, wyjście powinno być:

filex.txt:

2015/1/1,Rouba,14
2015/1/2,GG,78,Jina,17
2015/1/3,James,7,JJ,25
2015/1/4,Elie,15,Carole,8 

Jakaś pomoc ?

2
bak 26 czerwiec 2017, 14:41

4 odpowiedzi

Najlepsza odpowiedź

Jak jesteś na Linux OS, oto krótki liniowiec za pomocą awk narzędzie:

awk -F, 'NR==FNR{ a[$1]=$2 FS $3; next }{ if($1 in a) $0=$0 OFS a[$1] }1' file1 OFS=',' file2

Wyjście:

2015/1/1,Rouba,14
2015/1/2,GG,78,Jina,17
2015/1/3,James,7,JJ,25
2015/1/4,Elie,15,Carole,8
0
RomanPerekhrest 26 czerwiec 2017, 12:47

Próbować:

awk -F, 'NR==FNR{a[$1]=$2 FS $3;next}{printf("%s%s\n",$0,a[$1]?","a[$1]:"");}' file1  file2 > filex

Edytuj: Dodawanie formularza roztworu non-non-one teraz z wyjaśnieniem.

awk -F, 'FNR==NR{                                     ###-F is to set field separator, FNR==NR condition will be TRUE when first Input_file will be read. file in this case.
                a[$1]=$2 FS $3;                       ###creating an aray named a whose index is $1 and value is $2 FS $3, where FS is field seprator(space by default)
                next                                  ###next is awks built-in keyword which will skip all the next statements.
                }
                {
                printf("%s%s\n",$0,a[$1]?","a[$1]:"") ###printing the value of $0(current line of file2) and checking if array a value with index 41 is present
                }                                     ###if that is present then print , and array a value with index $1 else print null.
        ' file1 file2 > filex                         ###mentioning file1 and mentioning file2 also here.
0
RavinderSingh13 26 czerwiec 2017, 14:41

Bez użycia pandy, ale dłuższego rozwiązania:

import csv

file1_list = []
with open('file1', 'r') as file1:
    reader = csv.reader(file1)
    file1_list = [item for item in reader]


file2_list = []
with open('file2', 'r') as file2:
    reader = csv.reader(file2)
    file2_list = [item for item in reader]


for item in file1_list:
    print(item[0])


result = []

for item_1 in file1_list:
    for item_2 in file2_list:
        if item_1[0] == item_2[0]:
            item_1.extend(item_2[1:])
            result.append(item_1)

for item_1 in file2_list:
    flag = True
    for item_2 in result:
        if item_1[0] == item_2[0]:
            flag = False
    if flag:
        result.append(item_1)

for item_1 in file1_list:
    flag = True
    for item_2 in result:
        if item_1[0] == item_2[0]:
            flag = False
    if flag:
        result.append(item_1)

print(result)
0
Nurjan 26 czerwiec 2017, 12:45

file1.csv :

2015/1/2,Jina,17
2015/1/3,JJ,25
2015/1/4,Carole,8

file2.csv :

2015/1/1,Rouba,14
2015/1/2,GG,78
2015/1/3,James,7
2015/1/4,Elie,15

Twoje rozwiązanie:

import pandas as pd

df1 = pd.read_csv('file1.csv', names=["Name", "Age"], index_col=0,
                  header=-1)
df2 = pd.read_csv('file2.csv', names=["Name", "Age"], index_col=0,
                  header=-1)

df = pd.concat([df2, df1], axis=1)

df.to_csv('filex.csv', header=False)

filex.csv :

2015/1/1,,,Rouba,14
2015/1/2,GG,78,Jina,17
2015/1/3,James,7,JJ,25
2015/1/4,Elie,15,Carole,8

Jeśli chcesz usunąć wiele przecinków w {x0}} do:

import re

with open('filex.csv', 'r') as desc:
    filex = re.sub(',+', ',', desc.read())

with open('filex.txt', 'w') as desc:
    desc.write(filex)

filex.txt :

2015/1/1,Rouba,14,
2015/1/2,GG,78,Jina,17
2015/1/3,James,7,JJ,25
2015/1/4,Elie,15,Carole,8
1
glegoux 26 czerwiec 2017, 12:23