Removendo linhas indesejadas do arquivo csv com mais de 10 padrões a serem correspondidos

0

Eu tenho um arquivo CSV que tem 2 columns e eu tenho que match valores em uma única linha na coluna, se corresponder aos critérios que temos para manter a coluna, caso contrário delete do linha inteira . Abaixo está um exemplo do meu arquivo 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

aqui, além das linhas 4ª 5ª e 6ª, todas as outras linhas serão apagadas. Motivo para isso é:

  1. A primeira linha tem oint e patch à esquerda , mas o creme à direita , por isso será excluída.

    Da mesma forma, a 2ª e a 3ª linhas serão excluídas.

  2. As linhas 4ª e 6ª linhas não serão excluídas porque têm pomadas à esquerda e palavras semelhantes à direita.

Então, como implementar esse programatically , pois tenho mais de 10 condições semelhantes para corresponder antes que uma linha seja excluída.

Por favor, se alguém puder me ajudar. Thnx:)

    
por huzefa biyawarwala 24.11.2015 / 12:02

1 resposta

0

Eu posso criar este script Python que usa um nome de arquivo como argumento de linha de comando e gera o conteúdo inteiro, mas sem todas as linhas que não têm a string oint (sem distinção entre maiúsculas e minúsculas) em todas as colunas.

#! /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))

Copie o script acima e salve-o como qualquer arquivo, por exemplo, csvfilter.py .
Torne-o executável usando chmod +x csvfilter.py .

Em seguida, execute-o com o arquivo para processar como argumento único.
Exemplo de saída com seu exemplo acima (colunas separadas por 3 espaços) como 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

O script não modifica o arquivo original, apenas imprime a nova versão na saída padrão. Além disso, quaisquer caracteres de espaço em branco entre as colunas diferentes da cadeia configurada como COLUMN_SEPARATOR serão descartados.

Para substituir o arquivo original pela versão modificada, redirecione a saída de volta ao arquivo original:

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

Você também pode salvar a versão modificada como um arquivo:

$ ./csvfilter.py source.csv > modified.csv
    
por Byte Commander 24.11.2015 / 18:12