Удаление ненужных строк из CSV-файла, имеющего более 10 шаблонов для сопоставления

У меня есть файл CSV, который имеет 2 columns, и мне нужно match значений в одной строке в обоих столбцах, если это соответствует критериям, мы должны сохранить столбец в противном случае delete Весь ряд . Ниже приведен пример моего CSV-файла:

lidocaine (oint, patch) generic 1   tube of cream
lidocaine (oint, patch) generic 1   kit
lidocaine (oint, patch) generic 1   bottle of topical solution
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment
lidocaine (oint, patch) generic 1   bottle of lotion
lidocaine hcl (gel 2%, soln 4%) generic 1   patch

здесь, кроме строк 4-го, 5-го и 6-го все остальные строки будут удалены. Причина этого заключается в следующем:

  1. В первом ряду есть пометка и пятно слева, а в крем справа, поэтому он будет удален.

    Аналогично будут удалены 2-я и 3-я строки.

  2. 4-й, 5-й и 6-й ряды не будут удалены, поскольку они имеют мазь слева и аналогичную мазь слова справа.

Итак, как можно реализовать это programatically, поскольку у меня есть более 10 аналогичных условий, которые должны быть сопоставлены, прежде чем будет удалена строка.

Пожалуйста, если кто-нибудь может мне помочь. Спасибо:)

0
задан 24 November 2015 в 14:02

1 ответ

Я могу придумать этот сценарий Python, который берет имя файла в качестве параметра командной строки и производит все содержание, но без всех строк, которые не имеют строки oint (нечувствительный к регистру) во всех столбцах.

#! /usr/bin/env python3
import sys

COLUMN_SEPARATOR = "   "  # character or string used as column separator. Tab = "\t"
SEARCH_STRING = "oint".lower()  # case-insensitive string that needs to be present in all columns

with open (sys.argv[1]) as f:
  rows=[list(map(str.strip, line.split(COLUMN_SEPARATOR))) for line in f.readlines()]
  for r in rows:
    if all([SEARCH_STRING in r[i].lower() for i in range(len(r))]):
      print(COLUMN_SEPARATOR.join(r))

Скопируйте сценарий выше и сохраните его как любой файл, например. csvfilter.py.
Сделайте это исполняемым использованием chmod +x csvfilter.py.

Затем выполните его с файлом для обработки как отдельный аргумент.
Вывод в качестве примера с Вашим примером выше (столбцы, разделенные 3 пробелами) как source.csv:

$ ./csvfilter.py source.csv
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   tube of ointment
lidocaine (oint, patch) generic 1   jar of ointment

Сценарий не изменит исходный файл, но просто распечатает новую версию к стандартному выводу. Кроме того, любые пробельные символы между столбцами кроме строкового набора как COLUMN_SEPARATOR будет отброшен.

Для замены исходного файла измененной версией перенаправьте вывод назад в исходный файл:

$ ./csvfilter.py source.csv > source.csv

Можно также сохранить измененную версию как файл:

$ ./csvfilter.py source.csv > modified.csv
0
ответ дан 25 November 2015 в 00:02
  • 1
    @LDJames благодарит за информацию о gvfs-общем. Я хотел бы получить версию монтирования, работающую прямо сейчас, и в настоящее время она перестала работать с " монтирование cifs URL не реализованный yet" я не нашел опечатку. Возможно, я должен перезагрузить. Можете Вы объяснять, почему я получаю " 99" и " systemd-timesys" и что они имеют в виду? – CatMan 15 February 2017 в 07:13

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

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