2017-01-04 3 views
0

у меня есть два файла в этом форматеобъединить два файла

1.txt

1233445555, 
4333333322, 
12223344343 
22333444337 
33443445555 

2.txt

42202123456, 
42202234567, 
42203234568, 
42204356789, 

, что я хочу, чтобы занять позицию первого столбца в файле 2, сравнив первый столбец файла 1, если первая строка в столбце 1 файла 2 найдена в файле 1, вывод должен содержать позицию этой строки в файле1

из моей команды AWK я был в состоянии сортировать файл в соответствии колонок 1 2.csv, но не смог найти положение каждой строки

awk -F, 'FNR==NR {a[$1]=$0; next}; $1 in a {print a[$1]}' 1.csv 2.csv > 3.txt 

cat 3.csv 
38202123456 
48202234567 
672032345682 
76204356789 
88205443456 
+0

Вы можете импортировать оба csvs в dataframe pandas, а затем просто пропустить их оба, чтобы найти нужные позиции по позициям. Затем сохраните фрейм данных как новый csv (или перезапишите/распечатайте) –

ответ

1

Сначала создайте словарь ключ => индекс строки из второй файл, используя словарь понимания и индексов, начиная с 1.

Затем откройте файл 1 и поиска ключа в файле 2. при обнаружении записи данных & позицию, используя writerows и понимание генератора в качестве аргументов, поэтому производительность максимизируется.

import csv 

# create row => index dictionary 
with open("file2.csv") as f2: 
    # we only need first row 
    # so we discard the rest using *_ special syntax when unpacking rows 
    d = {first_cell:i+1 for i,(first_cell,*_) in enumerate(csv.reader(f2))} 

# write output 
with open("file1.csv") as f1, open("3.csv","w",newline='') as f3: 
    csv.writer(f3).writerows([k,"{} -position {}".format(v,d[k])] for k,v in csv.reader(f1) if k in d) 

Примечание: питон 2 должно заменить:

  • {first_cell:i+1 for i,(first_cell,*_) in enumerate(csv.reader(f2))} по {row[0]:i+1 for i,row in enumerate(csv.reader(f2))}
  • open("3.csv","w",newline='') по open("3.csv","wb")
+0

спасибо за код, который я выполнил, но есть синтаксическая ошибка – ltps

+0

python 3.py Файл «3.py», строка 7 d = {first_cell : я + 1 для я, (first_cell, * _) в перечислять (сг)}^ SyntaxError: недопустимый синтаксис – ltps

+0

благодаря изменил его, но все еще получаю ошибку питон 3.py Traceback (самый последний вызов последнего): File " 3.py ", строка 8, в d = {строка [0]: i + 1 для i, строка в перечислении (cr)} NameError: имя 'cr' не определено – ltps

0

Ниже Вы найдете решения исходной задачи, основанные на Питон index method ,

# Reading the CSV files 
with open('1.csv') as f1: 
    rows_1 = f1.read().split('\n') 

with open('2.csv') as f2: 
    rows_2 = f2.read().split('\n') 

# Extracting the colmuns of each file 
for i in xrange(len(rows_1)): 
    rows_1[i] = rows_1[i].split(',') 

# ...note that from the second CSV file we need only the first column 
for i in xrange(len(rows_2)): 
    rows_2[i] = rows_2[i].split(',')[0] 

# Comparing the data 
res = [] 
for r in rows_1: 
    try: 
     res.append(r[0] + ',' + r[1] + 
        ' -position ' + str(rows_2.index(r[0])+1)) 
    except: 
     pass 

# Saving the result in a new file 
with open('3.csv', 'w') as f3: 
    for r in res: 
     f3.write(r+'\n') 
Смежные вопросы