Alterações na linha do arquivo Csv para aparecer na loja virtual

0

Eu tenho um arquivo csv com itens como este:

"";"";"";"";"Park2";"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.";"PKT";"2";"100,0000";"-596,7500";"1";"0";"Lamella Koivu Natur Loc

- Ruotsalainen, laadukas
- 5G Lukkoponttiparketti, taitettava/painettava
- Helppo asentaa
- 3-sauvainen, mattalakattu
- Lauta 14x188x2266mm
- 3,41m2/pkt, 102,3m2/lava

29,33€/M2";""

O que eu preciso é que a saída seja assim:

"";"";"";"";"Park2";"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.";"PKT";"2";"100,0000";"-596,7500";"1";"0";"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2";""

Ou algo mais que funcionaria, não é exatamente assim. Eu testei adicionando br manualmente e funcionou. Eu só quero que as descrições dos itens tenham alterações de linha na webstore. Agora eles não, as mudanças de linha são removidas no processo de importação (componente de importação no joomla cms).

Estou criando o arquivo csv de um arquivo .txt em um script de shell.

    
por SamSwampwater 09.02.2017 / 11:20

4 respostas

1

$ csvsql -H -d ';' --query "SELECT a,b,c,d,e,f,g,h,i,j,k,l,REPLACE(m, char(10), '<br>'||char(10)),n FROM data" data.csv

Isso usa csvkit para tratar o arquivo CSV como uma tabela de banco de dados e seleciona todas as colunas (nomeadas a até n para um total de 14 colunas anônimas). Ele substitui as novas linhas literais ( char(10) ) na coluna 13 ( m ) com <br> seguido por nova linha.

Resultado:

,,,,Park2,"Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.",PKT,2,1000000,-5967500,1,0,"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2",

Se você quiser ; -delimiters na saída, passe o resultado para csvformat :

$ csvsql -H -d ';' --query "SELECT a,b,c,d,e,f,g,h,i,j,k,l,REPLACE(m, char(10), '<br>'||char(10)),n FROM data" data.csv | csvformat -D ';'
;;;;Park2;Lamella Koivu Natur Loc 5 3-sauvainen 14x188x2266mm. 3,41m2/PKT.;PKT;2;1000000;-5967500;1;0;"Lamella Koivu Natur Loc<br>
<br>
- Ruotsalainen, laadukas<br>
- 5G Lukkoponttiparketti, taitettava/painettava<br>
- Helppo asentaa<br>
- 3-sauvainen, mattalakattu<br>
- Lauta 14x188x2266mm<br>
- 3,41m2/pkt, 102,3m2/lava<br>
<br>
29,33€/M2";
    
por 09.02.2017 / 15:03
0
perl -0pe 's/("[^"]*")(?=[;\n])/ $1 =~ s!\n!<br>\n!gr /gse' ex.csv
  • perl -0pe ... esguicha a entrada e no final imprime o resultado
  • s/("[^"]*")(?=[;\n])/ action-perl /ge ... substitui todas as cadeias pelo resultado de ...
  • $1 =~ s!\n!<br>\n!gr substituindo as novas linhas por <br>\n
por 09.02.2017 / 13:34
0

Usando gawk , onde RS (o separador do registro) pode seja um regexp .

BEGIN {
    RS="\"\n"
}
{
    gsub("\n","<br>\n")
    print
}

Isso pressupõe que " no final de uma linha seja o final do registro, mas esse padrão também pode corresponder a uma nova linha no início de um campo. Quando isso acontece, nenhum <br> será inserido lá.

Outras versões do awk podem não suportar isso. A partir da awk especificação :

If RS contains more than one character, the results are unspecified.
    
por 09.02.2017 / 15:05
0

Eu gosto do ruby e do seu módulo CSV:

ruby -e '
  require "csv"
  options = {:col_sep => ";", :force_quotes => true}
  new_csv = CSV.generate(options) {|csv|
    CSV.foreach(ARGV.shift, options) {|row|
      row[-2].gsub!(/\n/, "<br>\n")
      csv << row
    }
  }
  puts new_csv
' file.csv
    
por 09.02.2017 / 19:02