Quando seu caractere de terminação de campo aparece dentro dos valores do campo

1

Eu tive uma manhã muito colorida aprendendo as partes internas do comando sort do Linux, e me deparei com outro problema que não consigo encontrar uma resposta em a documentação .

Atualmente estou usando -t, para indicar que meus campos são divididos pelo caractere de vírgula, mas estou descobrindo que em alguns dos meus arquivos, a vírgula é usada (entre aspas duplas) dentro de valores:

Jonathan Sampson,,[email protected],0987654321
"Foobar CEO,","CEO,",[email protected],,

Como posso usar uma vírgula para terminar meus campos, mas ignorar as ocorrências dentro de valores? Isso é bastante simples, ou eu preciso reexportar todos os meus dados usando um terminador de campo mais externo? (Infelizmente, eu não tenho nenhum controle sobre a declaração de um terminador diferente com este particular projeto).

    
por Sampson 18.05.2010 / 17:28

2 respostas

0

Acho que sort é completamente simplista em relação aos delimitadores de campo. Um bom candidato pode ser uma guia.

    
por 18.05.2010 / 17:52
0

O formato CSV permite que o campo contenha vírgulas, desde que o campo seja citado:

field1, "field2,with,commas"  ,  field3  ,  "field4,foo"

Temos aqui uma mistura de campos entre aspas e não citados, que não podem ser analisados diretamente por nenhum valor de FS (que eu conheço, pelo menos). No entanto, ainda podemos obter os campos usando match () em um loop (e trapaceando um pouco):

$0=$0",";                                  # yes, cheating

while($0) {

  match($0,/[^,]*,| *"[^"]*" *,/);            

  sf=f=substr($0,RSTART,RLENGTH);          # save what matched in sf

  gsub(/^ *"?|"? *,$/,"",f);               # remove extra stuff

  print "Field " ++c " is " f;

  sub(sf,"");                              # "consume" what matched

}

À medida que a complexidade do formato aumenta (por exemplo, quando as citações com escape são permitidas nos campos), as soluções awk ficam mais frágeis. Embora eu não deva dizer isso aqui, para algo mais complexo que o último exemplo, sugiro usar outras ferramentas (por exemplo, Perl apenas para citar uma). Btw, parece que há uma biblioteca de análise awk CSV aqui: link (eu não tentei) . p>     

por 27.06.2010 / 11:31