Поиск шаблонов в файлах 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. Я пытаюсь найти последовательности
5
задан 8 August 2014 в 17:50

3 ответа

Если мы интерпретируем Ваше требование, чтобы означать, что значение третьего поля (столбец) должно быть еще одним, чем то из второго поля (столбец), то с awk можно сделать вещи как

awk -F, '
$3==$2+1 {print "row "NR": "$0" was removed from "FILENAME > "file.log"; next}1
' file.csv > newfile.csv

который создаст Ваш file.log как указано и пишут остающиеся строки в newfile.csv. Можно переименовать newfile.csv кому: file.csv после для моделирования удаления.

5
ответ дан 23 November 2019 в 08:45

Я думаю, что Вам нужен более тяжелый язык программирования для этого. 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 является не всегда самым быстрым. Я использую его, потому что это - больше, чем достаточно быстро для веб-разработки, и время для записи намного быстрее (который является тем, что стоит мне времени/денег).

Можно ускорить вещи с PyPy. Это - альтернативное время выполнения Python, которое сравнивает удивительно хорошо. Вам, возможно, не понадобилась бы версия PPA (Надежный человек поставлется 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 или если Вы выполняете его, непосредственно изменяют вводную хижину на #!/usr/bin/env pypy. Я сделал некоторое очень простое тестирование на входном файле с 350000 строками (Ваш пример повторился 50000 раз) с вышеупомянутым сценарием.

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

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

6
ответ дан 17 November 2019 в 10:48

жемчуг:

$ 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
ответ дан 23 November 2019 в 08:45

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

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