Usando o bash para exportar uma lista separada por vírgula para html

2

Eu tenho um csv separado por cxomma que quero transformar em html personalizado e encontrei outro script que o fez, mas não foram nada além de problemas para mim desde que uso https://www.tutorialspoint.com/execute_bash_online .php para executá-lo.

Aqui está o script que encontrei: https://unix.stackexchange.com/questions/105501/convert-csv-to-html-table

Meu problema é que minha produção precisa ser um pouco diferente, e algo sobre o ECHO está realmente lutando. Então, aqui está um exemplo da minha lista:

Produto, 100 usd Agora, usando este script, desejo converter isso para parecer: Produto 100 usd

Basicamente, separando a lista em 2 células. Mas o eco continua a desaparecer, por isso é apenas uma bagunça. Não sei se é porque o emulador do bash quebra as linhas, mas continuo recebendo erros, nos quais parece assumir> <e tr e td é um comando .

Atualmente, meu script se parece com isso e reflete o quanto eu lutei com o eco ..:

while read INPUT ; do
echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
echo ""onmouseout="this.style.backgroundColor='#d4e3e5';>";
echo ""<td>${INPUT//,/</td><td><b>}</b></td></tr>";""
done

E isso gera:

$bash -f main.sh
main.sh: line 2: tr: No such file or directory
main.sh: line 4: ;
echo <td>six</td><td><b>nine</td><td><b>twelve</b></td></tr>: No such file or directory
main.sh: line 4: : command not found 

Eu experimentei como um louco com eco, mas agora estou no meu juízo final. Toda e qualquer ajuda é grandemente aceita com gratidão.

Aryat Mapreh
fonte

Respostas:

7

Sua citação está errada, especificamente as aspas duplas.

Vamos dividir o que você tem, os bits concatenados juntos

echo ""<tr onmouseover="this.style.backgroundColor='#ffff66';"";
  1. o comando echo
  2. uma string vazia ""
  3. um redirecionamento <tr- é aqui que o erro "arquivo não encontrado" vem
  4. um espaço
  5. uma linha onmouseover="this.style.backgroundColor='#ffff66';"
  6. uma citação aberta e ponto e vírgula, o primeiro caractere da próxima sequência

Para corrigir seus comandos de eco:

while read INPUT ; do
echo "<tr onmouseover=\"this.style.backgroundColor='#ffff66'\""
echo "onmouseout="this.style.backgroundColor='#d4e3e5'>"
echo "<td>${INPUT//,/<\/td><td><b>}</b></td></tr>"
done

Quando você tem uma combinação de aspas simples e duplas, um heredoc é muito legível. Além disso, use o readcomando para separar sua linha CSV.

while IFS=, read -r first second ; do
    cat <<END_HTML
        <tr onmouseover="this.style.backgroundColor='#ffff66'" onmouseout="this.style.backgroundColor='#d4e3e5'">
        <td>$first</td><td><b>$second</b></td>
        </tr>
END_HTML
done
Glenn Jackman
fonte
2
echonão lê de stdin, então um heredoc não seria útil aqui. Talvez você pretendesse usar catesse último trecho?
jwodder
2

Eu acho que você provavelmente está latindo na árvore errada com eco, provavelmente sed ou awk ou perl ou outra coisa pode ser uma solução melhor, mas, para que suas cordas de eco funcionem, você pode escapar das aspas e cifrões que deseja imprimir , gostar:

#Added  \                 \                                      \
$ echo "\"<tr onmouseover=\"this.style.backgroundColor='#ffff66';\"";
"<tr onmouseover="this.style.backgroundColor='#ffff66';"

$ echo "\"onmouseout=\"this.style.backgroundColor='#d4e3e5';>"
"onmouseout="this.style.backgroundColor='#d4e3e5';>

$ echo "\"<td>\${INPUT//,/</td><td><b>}</b></td></tr>\";\""
"<td>${INPUT//,/</td><td><b>}</b></td></tr>";"

man bash tem muito mais informações, consulte a seção Citações e observe coisas como:

metacaractere
Um caractere que, quando não está entre aspas, separa as palavras. Um dos seguintes:

|  & ; ( ) < > space tab newline

operador de controle
Um token que executa uma função de controle. É um dos seguintes símbolos:

|| & && ; ;; ;& ;;& ( ) | |& <newline>
Xen2050
fonte
Ok, então vamos esquecer o eco .. o que eu estou vendo no que for mais conveniente, como sed, awk ou perl?
Aryat Mapreh
0

SO, eu não uso scripts há muito tempo, muito menos o uso há anos. Mas tentei a última solução que você apresentou e quando o faço: cat prices.csv | sh test2.sh não retorna nada além de espaços em branco.

Quando tento a primeira solução, obtenho: ~ $ cat prices.csv | sh test2.sh test2.sh: 4: test2.sh: erro de sintaxe: redirecionamento inesperado

Portanto, não tenho certeza se estou usando a solução 2 errada e não sei por que a solução 1 ainda o faz?

Aryat Mapreh
fonte
Os arquivos que estou usando são arquivos de texto separados por vírgula, e não csv, esquecem isso.
Aryat Mapreh