Как стать автором
Обновить

Комментарии 21

Хмм... Вы предлагаете специально под задачу удаления строк в CSV ставить себе змеюку (да еще и библиотеку поставить)? Позвольте, не проще ли открыть его в том же Excel и повторить фокус №1?

Он ничего не предлагает, он пытается написать статью, но не очень понимает, как это делается :)

Есть варианты, зависит от того, что тебе удобнее.

Размеры файлов бывают очень большие, некоторые даже в Excel не откроются. Так что 4 строчки кода - это очень скромно, pandas проверенная библиотека.

В LibreOffice я что то сходу не нашёл как удалять дубликаты. Не помню, как потом я решил проблему, чисто технически Python скрипт мне наверное подошёл бы.

https://pq.hosting/help/instructions/94-udaljaem-dublikaty-libreoffice-calc.html

Почитал, получается это делается с помощью фильтров. Сам бы не догадался, так как в Excel фильтры не удаляют данные, а только скрывают их. Был уверен, что в LibreOffice фильтры работают точно так же.

Я вижу, вы пытаетесь начать карьеру журналиста. В принципе, настолько слабые статьи поначалу - это нормально, со временем научитесь. Но вот только Хабр - не очень подходящая площадка для тренировки. Попробуйте сначала свои силы где-нибудь на пикабу.

Если ваши данные сохранены в файле CSV, вы можете использовать Python для удаления дублирующихся строк. Сначала установите библиотеку pandas. <...>

В таких простых случаях частенько можно обойтись без внешних зависимостей, например:

python - How to remove duplicates from a csv file - Stack Overflow

with open('1.csv', 'r') as in_file, open('2.csv', 'w') as out_file:
    seen = set() # set for fast O(1) amortized lookup
    for line in in_file:
        if line in seen: continue # skip duplicate

        seen.add(line)
        out_file.write(line)

Как мне кажется, использование библиотеки pandas в данном случае - явный overkill...

Ну и если мы на линкусе, то даже питон не нужен, хватит одной короткой команды, использующей встроенные утилиты баша

Насколько я понимаю, на всех популярных десктопных платформах есть встроенные средства для решения подобных задач. Но, если человек уже использует Python или какой-то другой ЯП, почему бы им не воспользоваться.

Потому что если есть встроенные средства, то писать отдельную программу - это явный overkill?

Могу только за вас порадоваться. Я вот программирую на JavaScript и на Python, а вот имеющийся "искаропки" PowerShell так и не освоил...

Ну если речь про powershell, то соглашусь. Какой-то там синтаксис... ненатуральный.

Если что, ничего не имею против встроенных средств, включая PowerShell. Также восхищаюсь теми, кто пишет навороченные bat-файлы (своего рода магия).

Linux / Mac:

$ cat test.txt
test 1
test 2
test 3
test 3
test 4
$ cat test.txt | uniq
test 1
test 2
test 3
test 4
$ cat test.txt | uniq -u
test 1
test 2
test 4

Вот только второй вариант в принципе пропускает дубликаты, и к нему нужно добавить sort, чтобы остались все уникальные строки.

Когда повторяющиеся данные не идут друг за другом, сначала нужно отсортировать их, а затем удалить дубликаты.

/tmp ❯ cat test.txt
test 1
test 2
test 3
test 3
test 4
test 1

/tmp ❯ cat test.txt | uniq
test 1
test 2
test 3
test 4
test 1

/tmp ❯ cat test.txt | sort | uniq
test 1
test 2
test 3
test 4

/tmp ❯ cat test.txt | sort -u
test 1
test 2
test 3
test 4

Я думаю, что человек, который знает, как пользоваться пайтоном и более того одной из его библиотек, уже давно будет знать, как заниматься устранением дупликатов или сортировкой. И тогда не очень понятно, кто является ЦА этого мануала.. Больше напоминает: соберите и настройте веб-сервер, а теперь я расскажу, как с помощью HTML выделить текст болдом.

Добавлю свои пять копеек.

Вариант 1. Если файл небольшой (можно его скушать в Exell и там отсортировать), я часто делаю так:

1) Гружу данные в Exell.
2) Создаю столбец-ключ с номерами строк. Автозаполняю его этими номерами.
3) Сортирую таблицу по нужному полю (полям), которые будут проверяться на дубли.
(Если их больше трех, то мой старый Е такое не может, и я дополнительно делаю сперва сцепку из нужных полей)
4) Добавляю столбец, в котором вычисляется разностная функция двух соседних строк. Это может быть не только точное совпадение, но и какой-то другой критерий.
5) Сортирую таблицу по столбцу с результатами вычисления этой функции
6) Удаляю ненужные строки, которые не прошли мой критерий. Если результат функции - это число (а не логическое значение), то часто точный критерий удаления выбирается уже на этом этапе, после анализа результатов. Например, таким способом можно удалить из каталога землетрясений события, у которых время отличается не более, чем на 0.5с, а разность в координатах соизмерима с погрешностью их расчета. Перед тем, как принять окончательное решение по критерию, часто бывает полезно посмотреть на фактически присутствующие в каталоге "пары".
7) Восстанавливаю исходный порядок строк, сортируя оставшиеся в таблице строки по созданному на втором шаге ключу
8) Удаляю все созданные в процессе столбцы.

Вариант 2. Если файлы большие, или нужна потоковая обработка многих файлов, то могу предложить еще один метод из личной заначки. Он позволяет сравнивать строки не целиком, а по первым n символам, но только если дубль-строки идут подряд, и только в тех случаях, когда данные можно экспортировать в ASCII-формат (csv тоже сгодится) и обратно. И при условии, что Вы не побоитесь использовать

чужую программу

Она, конечно, выложена с исходниками и почти опенсорсная... Но если вдруг что-то пойдет не так, то претензии предъявлять будет некому. Разве что наплевать в карму автору ;-))

Более конкретно, вот в этой папке Яндекс-диска выложена пара десятков написанных мной в разное время перекодировщиков, которые

какую только фигню не делают с ASCII-файлами

В том числе и удаляют повторные строки. Краткое описание этих перекодировщиков лежит вот тут.

Но, некоторые из перекодировщиков есть только в DOS-версии - я их так и не пересобрал под Win, так как за последние 20 лет они мне ни разу

не пригодились

Например, в DOS многие редакторы затруднялись работать с очень большими файлами, а у меня таких много. Или "не умели" в прямоугольный блок (а мне надо было добавлять/удалять столбцы данных). Поэтому я для самых простых операций (типа замены в файле одного "символа" на другой - такое у меня с концами строк было) часто писал отдельную утилиту. А сейчас то же самое проще сделать в редакторе...

В частности, там есть исходный код и exe-шник программы DelDouble. Она читает текстовый файл и убирает оттуда повторяющиеся строки, но только если они идут подряд друг за другом. В командной строке можно задать число символов, по которым проводится сравнение строк (тогда правые части строк могут не совпадать - они все равно считаются дублями).

Кому интересно - берите ;-)

Два предупреждения

Первое: все эти программы распространяются as is, то есть я их написал для решения своей конкретной задачи и ее решение было единственным тестом ;-) Правда, за долгие годы большинство этих программ потом использовались повторно для решения других аналогичных задач, так что некоторый запас универсальности в них заложен. Может, и вам что-нибудь пригодится.

Второе: все эти программы написаны на фортране. Понимаю, что стек специфичный, поэтому вместе с исходниками там всегда лежит и exe-шник. Но будьте готовы, что пересобрать любую прогу под себя Вам будет проблематично. Причем, дело не только в языке, но и в зависимостях: там используется моя собственная библиотека функций (фактически фреймворк), на котором написан пакет ABD. Исходники этих функций (и всего этого пакета) можно найти вот тут... однако за 30 лет я их неоднократно рефакторил, и отдельные изменения, особенно связанные с переходом из среды DOS в Windows, не имеют обратной совместимости (мог измениться список параметров функции, а иногда даже ее название). Я сейчас изредка пересобираю свои старые DOS-перекодировщики, чтобы не париться с DosBox при их запуске, и далеко не всегда это получается без внесения правок в код.

А впрочем, любителям экзотических видов секса может понравиться ;-)

В Excel есть функция УНИК...

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории