Поиск шаблонов в файлах csv

У меня есть file.csv, который выглядит так

4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25
2,3,4,25,11

Я хочу найти некоторые шаблоны и сохранить их в другом файле журнала file.log и удалить их из первого файла. Perl или grep идеально

, например, если x + 1 = x2, в диапазоне от 3, удалите строку и запишите ее существование в другом файле и там, где она существует. Таким образом, 2,4,5,25,11 будет удален из file.csv, а в file.log я найду что-то вроде row 7: 2,3,4,25,11 was removed from file.csv. Я пытаюсь найти последовательности
1
задан 8 August 2014 в 18:50

2 ответа

Я думаю, для этого вам нужен более тяжелый язык программирования. Python - мой язык выбора, поэтому вот простой скрипт с простым примером теста:

import sys

tests = [
    lambda a, b, c, d, e: a+1==b and b+1==c and c+1==d and d+1==e,
]

with open(sys.argv[1]) as f:
    for line in f:
        if any(t(*map(int, line.split(','))) for t in tests):
            sys.stderr.write('Line removed: %s\n' % line)
            continue
        print line

Это, очевидно, только скелетный пример тестов, но он должен использоваться. Запустите нормально, он выведет только строки, которые не соответствуют STDOUT, и те, которые относятся к STDERR. Это делает его полезным для перенаправления в новый файл.

Здесь он находится в действии:

$ python patterns.py <(echo -n 1,2,3,4,5)
Line removed: 1,2,3,4,5

$ python patterns.py <(echo -n 1,2,4,4,5)
1,2,4,4,5

Как только вы загрузили его шаблонами, вы можете просто передать его csv: python patterns.py input.csv

Что касается производительности, Python не всегда самый быстрый. my использует его, потому что он более чем достаточно быстрый для веб-разработки, и время для написания намного быстрее (это то, что стоит мне время / деньги).

Вы можете ускорить процесс с PyPy. Это альтернативная среда исполнения Python, которая отлично изучает. Возможно, вам не нужна версия PPA (Trusty ships 2.2, PPA - 2.3.1), но вот как вы это сделали:

sudo add-apt-repository ppa:pypy/ppa
sudo apt-get update
sudo apt-get install pypy

Затем вы запустили свой скрипт с помощью pypy script.py или если вы его выполнение напрямую изменяет открывание shebang на #!/usr/bin/env pypy. Я провел очень простое тестирование на входном файле с 350000 строк (ваш пример с удивительным успехом ) с вышеупомянутым скриптом.

python2 запустил его в 1.417s и pypy запустил его в 0.645s. По моему опыту, вы, вероятно, увидите еще большее улучшение с более сложными algos.

... Но да, ничто из этого не будет бить эквивалент C / C ++. Если время, затрачиваемое на запуск, это деньги, потратьте некоторое время на повторное выполнение этого на более быстром языке.

6
ответ дан 24 May 2018 в 04:50
  • 1
    можно ли это сделать быстрее? вчера я пытался это сделать в большом файле, это занимает слишком много времени, по сравнению с perl, который делает это через 3 секунды – Lynob 8 September 2014 в 15:08
  • 2
    Заказ ваших тестов, поэтому, скорее всего, поможет, но вы достигнете точки, в которой Python отстает от других языков ... Это медленнее и быстрее, чем Perl ( для разных вещей ). Вы можете попробовать Pypy, который имеет тенденцию быть намного быстрее , чем стандартная среда исполнения Python по умолчанию ... Но если вы хотите сделать это серьезно, вы сделаете все это в C / C ++, который на этом уровне, это трудно сделать вообще. – Oli♦ 8 September 2014 в 15:16

perl:

$ perl -i.bak -F, -ane '
    if ($F[0]+1 == $F[1] and $F[1]+1 == $F[2]) {warn "row $.: $_"} else {print}
' file.csv 2>file.log
$ cat file.log
row 7: 2,3,4,25,11
$ cat file.csv
4,6,18,23,26
5,12,19,29,31
2,5,13,16,30
9,10,24,27,32
4,5,10,19,22
4,6,8,10,25
2
ответ дан 24 May 2018 в 04:50
  • 1
    если я поставлю его в script.pl, он не будет работать, только в терминале – Lynob 8 September 2014 в 14:08

Другие вопросы по тегам:

Похожие вопросы: