csv adicionando e removendo caracteres das linhas [closed]

1

Eu tenho um grande csv completo que parece tão

else if(a,b,c,d,e)
else if(a,b,c,d,f)

Eu quero que pareça assim

else if(a+x==b and b+x==c and c+x==d and d+x==e)
else if(a+x==b and b+x==c and c+x==d and d+x==f)

Nem sempre tenho 5 variáveis, algumas linhas têm menos que isso, 5 é máximo, 2 é mínimo.

basicamente remova as vírgulas e adicione após cada variável, var+x==var2 and var2+x==var3 ; fazendo com que pareça uma instrução C ++ if. Isso é factível em sed, awk ou perl? Estou mais interessado em awk, para fins de aprendizado, mas qualquer solução é boa se funciona.

    
por Lynob 23.10.2014 / 12:39

3 respostas

2

Ignore a parte perl e tente isto:

awk -F',' '{x = "+x=="; \
    for (i=2; i< NF; i++) { \
         x = x " and " $i "+x=="$(i+1) \
    }; \
    print "else if" x \
}'

Efeito:

$ echo '(a,b,c,d,e)' | awk -F',' '{x = "+x=="; \
quote>     for (i=2; i< NF; i++) { \
quote>          x = x " and " $i "+x=="$(i+1) \
quote>     }; \
quote>     print "else if" x \
quote> }'
else if(a+x==b and b+x==c and c+x==d and d+x==e)

Não seria muito difícil fazê-lo funcionar com a saída de perl (com o else if já incluído), mas usar uma ferramenta para o trabalho é melhor se não complicar as coisas (como em neste caso).

    
por muru 23.10.2014 / 12:53
4

Um caminho:

echo "else if(a,b,c,d,e)" | perl -pe 's/,([a-z])(?=[^)])/+x== and /g; s/,([a-z])/+x==/'
    
por Guru 23.10.2014 / 13:26
2

Solução textual Python pura. Precisa de pelo menos 2 variáveis, sem máximo.

#!/usr/bin/env python3

sourcefile = "/path/to/sourcefile"

def newline(oldline):
    subject = oldline.replace(" ", "").split("(")[-1].replace(")", "").split(",")
    out = [subject[i]+"+x=="+subject[i+1] for i in range(len(subject)-1)]
    print("else if("+" and ".join(out)+")")

with open(sourcefile) as sc:
    for line in [line.strip() for line in sc.readlines()]:
        newline(line)

Copie-o para um arquivo vazio, salve-o como edit.py , defina o caminho para o arquivo de origem, execute-o por:

python3 /path/to/edit.py

converte:

else if(a,b)
else if(a,b,c,d,f)
else if(a,b,c,d,f,q,t)

para:

else if(a+x==b)
else if(a+x==b and b+x==c and c+x==d and d+x==f)
else if(a+x==b and b+x==c and c+x==d and d+x==f and f+x==q and q+x==t)
    
por Jacob Vlijm 23.10.2014 / 13:50