Sprawdź, czy 2 linie mają takie same wartości dla 1 i drugiej kolumny w pliku, jeśli nie otrzymują one, a następnie dodać tę linię do innego pliku "wyjściowego", jeśli są takie same, a następnie na podstawie trzeciej kolumny (znaczek razy), najnowszy jest dodawany do pliku "wyjście".

Poniższy fragment poniżej porównuje pełną linię, a nie kolumny, jak mogę to zrobić dla kolumn?

#!/usr/bin/python
import os,sys,csv

file_open= sys.argv[1]
    with open (file_open,'r') as f1, open ('output.txt','w+') as f2:

    lines2 = f2.readlines()
    for line in f1:
            if line not in lines2:
                    f2.write(line)

Wejście

1,A,28/04/17 10:57:28.096

3,A,28/04/17 10:57:46.950

1,A,28/04/17 10:59:16.969

3,A,28/04/17 11:02:09.341

4,A,28/04/17 11:03:09.432

Oczekiwany wynik

1,A,28/04/17 10:59:16.969

3,A,28/04/17 11:02:09.341

4,A,28/04/17 11:03:09.432
-1
Harshit Khurana 25 czerwiec 2017, 15:54

3 odpowiedzi

Najlepsza odpowiedź

Ponieważ importujesz moduł csv, zalecam go używać.

import sys 
import csv

seen = set()

file_open = sys.argv[1]
with open(file_open, 'r') as f1, open('output.txt','w') as f2:
    reader = csv.reader(f1)
    writer = csv.writer(f2)

    for line in reader:
        if not len(line): # a quick check to make sure it's a valid line
            continue

        if (line[0], line[1]) not in seen:
            seen.add((line[0], line[1]))
            writer.writerow(line)

Ten kod sprawdza, aby upewnić się, że linia o tej samej pierwszej i drugiej kolumnie nie była już widoczna, zanim to pisze. Ktoczki są chronione, więc to jest proste.

Wynik:

1,A,28/04/17 10:57:28.096
3,A,28/04/17 10:57:46.950
4,A,28/04/17 11:03:09.432
0
cs95 25 czerwiec 2017, 13:11

Krótkie rozwiązanie przy użyciu funkcji itertools.groupby() i modułu datetime (do porównania Data Struny):

import sys, csv, itertools, datetime, operator

with open(sys.argv[1], 'r') as in_csv, open('output.csv', 'w') as out_csv:
    reader = csv.reader(in_csv)
    lines = [ max(g, key=lambda x: datetime.datetime.strptime(x[2], '%d/%m/%y %H:%M:%S.%f'))
              for k,g in itertools.groupby(sorted(reader, key=lambda r: (r[0], r[1])), key=operator.itemgetter(0,1))]

    writer = csv.writer(out_csv, lineterminator='\n')
    for l in lines:
        writer.writerow(l)

wyjście.csv Spis treści:

1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432
0
RomanPerekhrest 25 czerwiec 2017, 13:54

Zmodyfikowana wersja @ Coldspeed's Code używać OrderedDict, aby zachować najnowsze wpisy zgodnie z znacznikiem czasu (zakładając że znacznik czasu wyjdzie w kolejności).

import sys 
import csv

from collections import OrderedDict

history = OrderedDict()

file_open = sys.argv[1]
with open(file_open, 'r') as f1, open('output.txt','w') as f2:
    reader = csv.reader(f1)
    writer = csv.writer(f2)

    for line in reader:
        if not len(line): # valid line check
            continue
        history[(line[0], line[1])] = line[2] # Adds if present, updates if new

    for line in list(history.items()):
        writer.writerow([line[0][0], line[0][1], line[1]])

Zawartość output.txt:

1,A,28/04/17 10:59:16.969
3,A,28/04/17 11:02:09.341
4,A,28/04/17 11:03:09.432
0
Ébe Isaac 25 czerwiec 2017, 13:31