Как извлечь данные, присутствующие между 2 совпадающими элементами (из CSV) внутри текстового файла? - PullRequest
0 голосов
/ 28 января 2020
Quetiapine fumarate Drug substance  This document
Povidone    Binder  USP
This line doesn't contain any medicine name.
Dibasic calcium phosphate dihydrate Diluent USP is not present in the csv
Lactose monohydrate Diluent USNF
Magnesium stearate  Lubricant   USNF

Выше представлены примеры данных из файла .txt:

У меня есть список названий лекарств, которые я хочу сопоставить в файле .txt, и извлекать все данные, которые присутствуют между 2 Лекарства. (Пример лекарств из файла csv: 'Quetiapine fumarate', 'Povidone', 'Magnesium stearate', 'Lactose monohydrate' etc etc.)

веществоcopy.csv - это файл, содержащий список всех лекарств, которые я использовал в своем коде ниже.

Я хочу повторить каждую строку моего текстового файла и создавайте группы из одного лекарства в другое.

Пример вывода:

['Quetiapine fumarate   Drug substance  This document'],
['Povidone  Binder  USP'],
['Lactose monohydrate   Diluent USNF'],
['Magnesium stearate    Lubricant   USNF']

Учитывая, что 'Quetiapine fumarate', 'Povidone', 'Lactose monohydrate ', 'Magnesium stearate' присутствуют в моем списке веществ в csv.

Может ли кто-нибудь помочь мне сделать то же самое в Python?

Попытка до сих пор:

import re
import pandas as pd
import csv
import os
file = open(r'C:\Users\substancecopy.csv', 'r')
oo=csv.reader(file)
allsub = []
for line in oo:
    allsub.append(line)

flat_list = [item for sublist in allsub for item in sublist]    


def extract(filename):
    file=open(filename,encoding='utf-8')
    file=file.read()

    n=[]
    for x in flat_list:
        my_regex = r"^\s?" + re.escape(x)
        #my_regex_new = r"\b" + re.escape(my_regex) + r"\b"
        if re.search(my_regex,file,flags=re.IGNORECASE|re.MULTILINE):
            n.append(x)


    n.sort()
    return n

Мне нужно захватить весь текст из одного лекарства в другое, как показано в примере вывода, чего не происходит с этим фрагментом кода

1 Ответ

0 голосов
/ 28 января 2020

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

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

result = [[row.strip()] for row in data for med in meds if med in row]

#[['Quetiapine fumarate Drug substance  This document'], ['Povidone    Binder  USP'], ['Lactose monohydrate Diluent USNF'], ['Magnesium stearate  Lubricant   USNF']]

Я загрузил названия лекарств в список, который вам, возможно, придется адаптировать к вашему csv.

meds = ['Quetiapine fumarate', 'Povidone', 'Magnesium stearate', 'Lactose monohydrate']

with open('1.txt', 'r') as file:
    data = file.readlines()

result = [] # Empty list to store our findings

for idx, row in enumerate(data): # Get index and value of each line in the text file
    count = 0 # Set a counter for each row, this is to determine if there are no matches

    for med in meds:
        if med in row and med not in data[idx-1]: # If medication is matched and the same medication is not found in the previous row
            result.append([row.strip()])
        else: # No match found on this medication, increase counter
            count += 1

    if count == len(meds): # If count == total medication, declare no match and append to previous row
        result[-1].append(row.strip())



for i in result:
    print(i)

#['Quetiapine fumarate Drug substance  This document']
#['Povidone    Binder  USP', 'Povidone new line', "This line doesn't contain any medicine name.", 'Dibasic calcium phosphate dihydrate Diluent USP is not present in the csv']
#['Lactose monohydrate Diluent USNF']
#['Magnesium stearate  Lubricant   USNF']

Я добавил Povidone new line к тестовому файлу, чтобы продемонстрировать, что если в одной и той же строке найдено то же название лекарства, оно добавляется к последнему результату.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...