У меня есть файл 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-го все остальные строки будут удалены. Причина этого заключается в следующем:
В первом ряду есть пометка и пятно слева, а в крем справа, поэтому он будет удален.
Аналогично будут удалены 2-я и 3-я строки.
4-й, 5-й и 6-й ряды не будут удалены, поскольку они имеют мазь слева и аналогичную мазь слова справа.
Итак, как можно реализовать это programatically
, поскольку у меня есть более 10 аналогичных условий, которые должны быть сопоставлены, прежде чем будет удалена строка.
Пожалуйста, если кто-нибудь может мне помочь. Спасибо:)
Я могу придумать этот сценарий 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