como posso adicionar um caractere extra depois de uma pesquisa por palavra [closed]

2

Eu tenho os seguintes nomes de campo

demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm

Abaixo está uma amostra do meu arquivo. Existem mais colunas antes do primeiro fck=83 ...

 fck=83;fcv=naismc;fcv=naisjdf;fck=83;fmd=1422811694,;fmd=1422811694;
 fck=83;fcv=demelog;fck=83;fmd=1423134370;
 fck=83;fcv=demelog;fck=83;fmd=1422292546;
 fck=83;fcv=demelog;fck=83;fmd=1421774352;
 fck=83;fcv=decoccm;fck=83;fmd=1422853444;
 fck=83;fcv=voyapro;fck=83;fmd=1422270462;
 fck=83;fcv=voyapro;fcv=demelog;fck=83;fmd=1422183999,;fmd=1422206234,;

A partir de fck = 83, como você pode ver, eu posso ter line 2 fcv = demelog e o relevante fmd 1423134370 ou para a linha 7, fcv = voyapro e fcv = demelog e o fmd relevante também fmd=1422183999, e fmd=1422206234;

Você se lembra da primeira linha demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm ?

Meu objetivo é ter o seguinte formato (usarei a linha 2 e a linha 7 como exemplo)

linha 2

 fck=83;fcv=demelog;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;

linha 7

 fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;;

Como você pode ver, adicionei colunas extras para fck = 83 para o fcv e o fmd, relacionadas a esse demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm

Eu pensei em fazer isso com awk ou sed ou python, mesmo que eu não tenha a menor idéia de como fazer isso com python nem com o awk and sed.

Talvez eu possa adicionar o demelog voyapro naisjdf naismc decoide decoccm travide travccm equiccm mariccm em um arquivo separado e fazer uma pesquisa com um índice. Se a corda está aqui, não estou fazendo nada. Se não estiver aqui, adicionarei uma coluna extra.

Qualquer ajuda é bem-vinda, pois estou confuso sobre onde devo ir tecnicamente falando e começar a puxar meu cabelo.

atualização

Esta minha tentativa abaixo em python

import re
word_list=    ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']


regex_string = "(?<=\W)(%s)(?=\W)" % ";".join(word_list)

find=re.compile(regex_string)

with open ("idcacf_v5.txt", "r") as myfile:
    data=myfile.read().replace('\n', '')


finder = re.compile(regex_string)
string_to_be_searched = data

results = finder.findall ("%s " % string_to_be_searched)
result_set = set(results)
for word in word_list:
    print ("%s in string" % word)

Como você pode ver, eu preciso de duas coisas, para poder indexar. A segunda coisa é que eu preciso ser capaz de replicar o que eu fiz com o fcv em termos de ordem e colocar o mesmo pedido com fmd=timestamp dessa linha.

    
por Andy K 11.02.2015 / 18:14

1 resposta

2

Aqui está algo que eu usei no módulo CSV:

#! /usr/bin/env python3

import csv, sys

word_list = ['fcv=demelog','fcv=voyapro','fcv=naisjdf','fcv=naismc','fcv=decoide','fcv=decoccm','fcv=travide','fcv=travccm','fcv=equiccm','fcv=mariccm']

csvin = csv.reader (sys.stdin, delimiter=';')
csvout = csv.writer (sys.stdout, delimiter=';')
for row in csvin:
    word_list_fck = [row[0]] + word_list
    fmd_start = row[1:].index(row[0]) + 1
    row_fcv = row[:fmd_start]  # split fcv from fmd
    row_fmd = row[fmd_start:]
    out_row = [entry if entry in row_fcv else ''  for entry in word_list_fck]
    out_row = out_row + [row_fmd.pop(0) if out_row[i] != '' else '' for i in range(len(word_list_fck))]
    csvout.writerow (out_row)

Exemplo de saída:

$ python3 test.py < test.txt
fck=83;;;fcv=naisjdf;fcv=naismc;;;;;;;fck=83;;;fmd=1422811694,;fmd=1422811694;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1423134370;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1422292546;;;;;;;;;
fck=83;fcv=demelog;;;;;;;;;;fck=83;fmd=1421774352;;;;;;;;;
fck=83;;;;;;fcv=decoccm;;;;;fck=83;;;;;;fmd=1422853444;;;;
fck=83;;fcv=voyapro;;;;;;;;;fck=83;;fmd=1422270462;;;;;;;;
fck=83;fcv=demelog;fcv=voyapro;;;;;;;;;fck=83;fmd=1422183999,;fmd=1422206234,;;;;;;;;

Notas:

  • Confio no primeiro elemento da linha ( fck=83 nos casos de exemplo) para ser a entrada que separa fcv s de fmd s. Se não, essa coisa vai ser muito mais complicada.
  • Dado o if bar in foo repetido nas compreensões da lista, isso pode ser muito lento, dependendo do comprimento de cada linha.

Em relação a out_row = [entry if entry in row_fcv else '' for entry in word_list_fck] :

  • Considere como a saída desejada será semelhante quando analisada por csv.reader para uma lista (considerando, por exemplo, a segunda linha): ["fck=83" ,"fcv=demelog", "", "", "", "", "", "", "", "", "", "", "fck=83", "fmd=1423134370", "", "", "", "", "", "", "", "", ""] - todas as entradas vazias se tornarão sequências vazias.
  • A saída deve conter entradas vazias para cada fcv que não foi exibido na entrada.
  • Portanto, ao criar essa lista para escrever usando csv.writer , eu uso strings vazias para todas as entradas fcv que não aparecem em row_fcv ( if entry in row_fcv else '' ).
por 11.02.2015 / 19:00