Como criar um arquivo CSV sem espaços desnecessários? [fechadas]

2

Estou usando o binário xls2csv para traduzir o documento XLS para CSV na minha máquina Red Hat Linux.

Por exemplo: (da página man):

 xls2csv -x "1252spreadsheet.xls" -b WINDOWS-1252 -c "ut8csvfile.csv" -a UTF-8

Mas notei as seguintes coisas, que causam problemas no meu script Bash:

  1. A saída de CSV inclui espaços desnecessários (no lado esquerdo da palavra ou no lado direito da palavra)

    Exemplo de sintaxe incorreta em CSV:

     ,"/var/adm/sys ldd/all  /Comm/logs   ","WORD "," WORD"
    

    Exemplo de sintaxe correta em CSV:

     ,"/var/adm/sys ldd/all  /Comm/logs",WORD,WORD
    
  2. As aspas aparecem no CSV quando não são necessárias:

    Exemplo de sintaxe incorreta em CSV:

     ," WORD ",
    

    Exemplo de sintaxe correta no csv

     ,WORD,
    

Como posso alterar a saída para criar um arquivo CSV "limpo"?

Eu estou procurando um forro awk / sed / perl, ou qualquer outra solução que funcione em um script Bash.

Exemplo de arquivo CSV antes da correção:

 1,"/var/adm/sys ldd/all  /Comm/logs",34356,"234245 ",24245
 2,"/var/adm/sys ldd/all
 /Comm/debugs.txt"," 45356",435,"  578 58976  "
 3,"   add this line in crontab    :",34356,"234245 ",24245
 4,"1.0348    54 35.5"," 45356","   435","578 "
 4,"1 2 "," 45356 95857 ","   435","578 "
 5,"1 2 "," 45356 95857 ","   "435","578" "
 6,"1.0348    54 35.5"," 45356"," "4"""    ""35","578 "
 7,"1.0348    54 35.5",""45356",""4"""""35,"578 "

Exemplo de arquivo CSV corrigido (após a correção):

 1,"/var/adm/sys ldd/all  /Comm/logs",34356,234245,24245
 2,"/var/adm/sys ldd/all
 /Comm/debugs.txt",45356,435,"578 58976"
 3,"add this line in crontab    :",34356,234245,24245
 4,"1.0348    54 35.5",45356,435,578 
 4,"1 2","45356 95857",435,578
 5,"1 2","45356 95857","435,578" 
 6,"1.0348    54 35.5",45356,"4"""    ""35,578
 7,"1.0348    54 35.5",""45356",""4"""""35,578

As vírgulas não podem aparecer nos campos.

Observe a nova linha explícita contida em um campo de line 2 .

Quando um campo está entre aspas duplas e não contém espaços em branco (por exemplo, linha 7 ""45356" ), essas aspas duplas não devem ser removidas porque o campo inteiro, incluindo as citações, é uma senha codificada.

    
por maihabunash 28.07.2014 / 17:56

1 resposta

0

Esse código perl produz quase exatamente a saída esperada:

use Text::CSV;

my $csv = Text::CSV->new({ binary => 1, eol => $/, allow_loose_quotes => 1, escape_char => undef });

open my $io, "<", $ARGV[0] or die;

while (my $row = $csv->getline ($io)) {
        my @o = map { $_ =~ s,^\s*,,; $_ =~ s,\s*$,,; $_; } @{$row};
        $csv->print(STDOUT, \@o);
}

saída é

1,"/var/adm/sys ldd/all  /Comm/logs",34356,234245,24245
2,"/var/adm/sys ldd/all
/Comm/debugs.txt",45356,435,"578 58976"
3,"add this line in crontab    :",34356,234245,24245
4,"1.0348    54 35.5",45356,435,578
4,"1 2","45356 95857",435,578
5,"1 2","45356 95857",""435","578""
6,"1.0348    54 35.5",45356,""4"""    ""35",578
7,"1.0348    54 35.5",""45356",""4"""""35,"578"
    
por 10.02.2016 / 20:19