2015-10-29 3 views
1

данных:Как удалить повторяющиеся строки из CSV?

112343 The data point was created on 1903. 
    112344 The data point was created on 1909. 
    112345 The data point was created on 1919. 
    112346 The data point was created on 1911. 
    112346 The data point was created on 1911-12. 
    112346 The data point was created on 1911-12. 
    112347 The data point was created on 1911. 
    112348 The data point was created on 1911. 

Здесь дубликаты ид. Я хочу, чтобы дубликаты были удалены, но я хочу сохранить самую длинную строку [1] (как показано на идеальном выходе).

Вот что я пробовал:

import sys 
import csv 
import re 
import string 

df = csv.reader(‘fil.csv’, delimiter = ',') 

for r in df: 
    dup = next(df) 
    if r[0] == dup[0]: 
     r[1] < dup[1]: #I am checking if the text is larger then the previous 
      print dup[0], dup[1] 
    else: 
     print r[0], r[1] 

Но я получаю результат, как,

112343 The data point was created on 1903. 
112346 The data point was created on 1911-12. 
112346 The data point was created on 1911-12. 
112346 The data point was created on 1911. 
112348 The data point was created on 1911. 

Ряды не хватает!

Идеальный выход будет

112343 The data point was created on 1903. 
112344 The data point was created on 1909. 
112345 The data point was created on 1919. 
112346 The data point was created on 1911-12. 
112347 The data point was created on 1911. 
112348 The data point was created on 1911. 

Как это можно сделать? Какое условие или ключевое слово можно использовать? Или у меня есть два повторяющихся файла и сравнение строк между ними для устранения дубликатов?

+0

'cat fil.csv | sort | uniq> fil_deduped_sorted.csv' – Alik

+0

@Alik, который все еще имеет две строки, начиная с' 112346' – user1717828

+0

@ user1717828, вы правы. OP должен четко указывать, что он имеет ввиду, спрашивая, как удалить ** повторяющиеся строки **, так как '112346 Точка данных был создан в 1911 году. 'и' 112346. Точка данных была создана 1911-12. 'не дублируются – Alik

ответ

0

Причина, по которой ваши пропущенные строки кода связаны с тем, что функция next. В моем решении я сначала прочитал все строки в list, а затем сортировал list вторым столбцом, если первое значение столбца совпадает, мы просто сохраняем первую строку и пропускаем другие.

import csv 
from operator import itemgetter 
with open('file.csv', 'rb') as f: 
    reader = csv.reader(f) 
    your_list = list(reader) 

your_list.sort(key=itemgetter(1)) # sorted by the second column 
result = [your_list[0]] # to store the filtered results 
for index in range(1,len(your_list)): 
    if your_list[index] != your_list[index-1][0]: 
     result.append(your_list[index]) 
print result 
+0

'your_list [index-1] [0]' - у вас есть недостаток. Что делать, если входной файл содержит строки, где первый столбец один и тот же? Я считаю, что ваш код приведет к пустым результатам в этом случае – Alik

+0

Да, Алик прав. Плюс мои строки уже отсортированы, как указано в данных! –

+0

@ Алик, вы правы, я обновил свой код – Hooting

0

How to remove duplicate rows from CSV?

Открыть CSV в Excel. Excel имеет встроенный инструмент, который позволяет удалять дубликаты. Следуйте за this tutorial для получения дополнительной информации.

+0

Предполагая, что вопрос задает наилучший способ удаления повторяющихся строк из CSV и не ограничивается программным способом. Причина, по которой я говорю, это потому, что мой друг (исследователь в области биологии) однажды задал мне аналогичный вопрос - оказывается, он изучал программирование, чтобы ему не пришлось вручную идентифицировать и удалять повторяющиеся записи из массивных листов excel. Он не понимал, что у него есть эта особенность :). – JSideris

1

Моя попытка:

import csv 
import collections 

csv_input = """ 112343, The data point was created on 1903. 
    112344, The data point was created on 1909. 
    112345, The data point was created on 1919. 
    112346, The data point was created on 1911. 
    112346, The data point was created on 1911-12. 
    112346, The data point was created on 1911-12. 
    112347, The data point was created on 1911. 
    112348, The data point was created on 1911.""" 

reader = csv.reader(csv_input.split('\n'))  

result = collections.OrderedDict() 
for row_id, data in reader: 
    if len(result.get(row_id, ''))<len(data): 
     result[row_id] = data 

for row_id, data in result.items(): 
    print "{},{}".format(row_id, data) 
+0

это работает. Но вы вводите csv_input как строку, а затем используете csv reader. Но у меня есть файл csv. Не строка! Можно ли считать это строкой? –

+0

@GanapathyMani да, можно прочитать файл в строке – Alik

1

Попробуйте это:

some_dict = {} 
file_name = "sample.csv" 
with open(file_name) as f: 
    data = csv.reader(f,delimiter = ' ') 
    for row in data: 
     key = row.pop(0) 
     if key in some_dict: 
      if len(row[0])>len(some_dict[key]): 
       some_dict[key] = row.pop(0) 
     else: 
      some_dict[key] = row.pop(0) 

for key,value in some_dict.iteritems(): 
    print key,value 
+0

Я получаю: AttributeError: объект 'str' не имеет атрибута 'pop' –

+0

Это не сработает. Также словари в python не сохраняют порядок – Alik

+0

@Ganapathy меняет разделитель на фактический разделитель, используемый в вашем файле (',', '\ t', ';' и т. Д.), И это работает. Если вы используете неправильный, он не будет разделять столбцы, поэтому вы получите одну строку. – Termi

1

Мое решение было быть-

import csv 
unqkey =set() 
data = [] 

with open("C:\data.csv") as csvfile: 
    reader = csv.reader(csvfile) 
    for row in reader: 
     unqkey.add(row[0]) 
     data.append(row) 


unqkey = sorted(list(unqkey)) 

for i in unqkey: 
    r=[] 
    for j in data: 
     if j[0]==i: 
      r.append(' '.join(j)) 
      r.sort(key=len) 
    print r[-1] 

это prints-

112343 The data point was created on 1903. 
112344 The data point was created on 1909. 
112345 The data point was created on 1919. 
112346 The data point was created on 1911-12. 
112347 The data point was created on 1911. 
112348 The data point was created on 1911. 
+0

вам решение по какой-то причине, Мессинг порядок, когда я бегу через CSV. –

+0

Ах! у вас будет больше контента csv или что такое сообщение об ошибке. – SIslam

1

Я работаю над (не необоснованным) предположением, что ваши данные всегда отсортировано по id.

Инициализация

from sys import maxint 
prev_id = maxint 
longest = "" 
data = open('myfile.dat') 

Цикл данных

for row in data: 
    curr_id = int(row.split()[0]) 
    if prev_id < curr_id: 
     print longest 
     longest = row 
    elif len(row)>len(longest): 
     longest = row 
    prev_id = curr_id 
# here we have still one row to output 
print longest 

Относительное достоинство этого ответа заключается в его эффективности памяти, а строки обрабатываются один за другим. Конечно, эта эффективность зависит от порядка, который я принял в файле данных!

+0

получение этой ошибки: AttributeError: объект «list» не имеет атрибута «split». Я использую CSV-файл. –

+0

В моем коде есть один экземпляр 'split', в' row.split() 'и' row' - строка, потому что строка - это то, что возвращается из итерации над объектом 'file'. Если вам нужно обрабатывать ваши данные в виде файла CSV (TSV, возможно?), Вам нужно адаптировать мой код, но будьте осторожны, поскольку вы попросили (удаление дубликатов), использование модуля 'csv' абсолютно безвозмездно. – gboffi

0

Вот как я удалил дубликаты.

Во-первых, я удалил дубликаты через Excel. Но были и другие дубликаты с разными размерами столбцов (один и тот же идентификатор, но различная длина для строки [1]).В дублированных парах строк, я хочу, чтобы строки, которые имеют больший второй столбец (Len (строка [1] выше). Вот что я сделал,

import csv 
import sys 
dfo = open('fil.csv', 'rU') 
df = csv.reader(dfo, delimiter = ',') 

temp = '' 
temp1 = '' 

for r in reversed(list(df)): 
    if r[0] == temp: 
     continue 
    elif len(r[1]) > len(temp1): 
      print r[0] + '|' + r[1] + '|' + r[2] + '|' + r[3] 
      #I used | for the csv separation. 
    else: 
     print r[0] + '|' + r[1] + '|' + r[2] + '|' + r[3] 

    temp = r[0] 
    temp1 = r[1] 

Это заботился о дубликатах. Здесь я в основном пропустите повторяющуюся строку с меньшим размером r [1]. Теперь я получил распечатанный список. Я сохранил его в файле csv и снова распечатал этот новый файл (восстановив исходный порядок). Он решил проблему.

Смежные вопросы