2016-01-06 2 views
0

У меня есть большой файл с кучей данных фильма, в том числе уникальный идентификатор для каждого фильма. хотя каждый идентификатор в каждой строке уникален, некоторые строки включают в себя дублированные данные фильма.Как удалить дубликаты в CSV-файле?

Например:

ID,movie_title,year 
1,toy story,1995 
2,jumanji,1995 
[...] 
6676,toy story,1995 
6677,jumanji,1995 

В этом случае, я хотел бы, чтобы удалить укомплектовать в 6677,toy story,1995 и 6677,jumanji,1995 линии. Это происходит не только с одним фильмом, поэтому я не могу просто найти и заменить. Я попытался использовать функцию Sublime Text Edit>Permute Lines>Unique, и он отлично работает, но в итоге я потерял первый столбец данных (уникальные идентификаторы).

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

+0

Какие инструменты можно использовать? На какой платформе вы работаете? Является ли это разовой работой или эта проблема возникает неоднократно? – collapsar

+0

@collapsar Я нахожусь в OS X, я буду использовать любой инструмент, который выполнит задание (номера bash/python/OS X/что-то еще), поскольку это одноразовая работа. – f7n

ответ

0

Следующий скрипт perl выполняет трюк. Фактически, все вхождения фильма, кроме первого, будут удалены из списка записей. Не забудьте добавить пути к файлу. Выполнить с 'Perl' из командной строки (Mac OS X поставляется с Perl):

use IO::File; 

my (
     $curline 
    , $fh_in 
    , $fh_out 
    , $dict 
    , @fields 
    , $key 
    , $value 
); 

$fh_in = new IO::File("<..."); # add input file name 
$fh_out = new IO::File(">..."); # add output file name 
while (<$fh_in>) { 
    chomp; 
    $curline = $_; 
    @fields = split (/,/, $curline); 
    ($key, $value) = (join(',', @fields[1..$#fields]), $fields[0]); 
    if (!exists($$dict{$key})) { 
     $$dict{$key} = 1; 
     $fh_out->print("$curline\n"); 
    } 
} 
$fh_out->close(); 
exit(0); 

Разъяснение

  • код обрабатывает входной построчно
  • Он поддерживает хэш фильма идентификаторы.
  • Идентификаторы фильмов определяются как содержимое линии без номера идентификатора и сразу после запятой.
  • Линия печатается, если идентификатор фильма еще не был замечен.

Caveat

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

    my $key_norm; # move that out of the loop in production code 
    $key_norm = lc($key);   
    if (!exists($$dict{$key_norm})) { 
        $$dict{$key_norm} = 1; 
        $fh_out->print("$curline\n"); 
    } 
    
  • Ни элегантности, ни производительность была слово в авторинга этот код ;-)

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