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 separafcv
s defmd
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 entradasfcv
que não aparecem emrow_fcv
(if entry in row_fcv else ''
).