Não é possível obter contagem precisa de registros de um arquivo csv

0

Eu tenho um arquivo .csv que tem alguns valores formatados como parágrafos com quebras de linha ou às vezes marcadores.

"STAT","ID","DESC"
"UPD", "1", "Updated"
"CHG", "2", "Changed"
"UPD", "3", "Updated.
Might have to update again"
"UPD", "4", "Updated.

 - once 
 - twice
 - thrice
"
"DEL", "5", "unknown"
"DEL", "6", "Deleted
Need to restore"

Eu preciso contar o número de registros, usei awk como abaixo, pois sabia que a segunda coluna é id única, mas retorna mais do que eu. Acima de texto é claro manequim como eu não tenho permissão para compartilhar original, mas tentei refletir o mais fielmente possível.

 awk  '{print $2}' FS=","  sample.csv | wc -l 

Eu até imprimi a primeira coluna usando awk '{print $ 1}' para verificar apenas os valores da primeira coluna, mas a saída mostra as partes iniciais da nova linha nos parágrafos.

Por favor, deixe-me saber se alguma informação adicional é necessária e atualizarei a questão.

    
por vchollati 13.01.2015 / 00:04

2 respostas

0

Uma maneira de fazer isso com awk é

awk -v RS=$'"\n"' 'END {print NR}' sample.csv
  • RS=$'"\n"' define o eparator R ecord S (que é nova linha por padrão) para a string de três caracteres " , newline, " . Essa sintaxe pode funcionar apenas em bash . Isso fará com que seu arquivo seja decomposto nos seguintes registros:

    1: "STAT","ID","DESC

    2: UPD", "1", "Updated

    3: CHG", "2", "Changed

    4: UPD", "3", "Updated.
    Might have to update again

    5: UPD", "4", "Updated.

    - once
    - twice
    - thrice

    6: DEL", "5", "unknown

    7: DEL", "6", "Deleted
    Need to restore"

    Isso pressupõe que não haja espaços em branco no arquivo.

  • 'END {print NR}' lê o arquivo até o final e imprime o número do registro - em outras palavras, o número de registros.

Arquivos de texto geralmente são considerados como uma sequência de linhas, delimitado por caracteres de nova linha ou sequências de caracteres. E, geralmente, um “registro” em um arquivo de texto é considerado como uma linha. Mas awk permite que você especifique um separador de registro diferente de nova linha. Como a string quote-newline-quote aparece entre cada par de registros consecutivos no seu arquivo, especificando-o como seu separador de registro divide o arquivo em (quase) os registros que você deseja.

Mas o separador de registro é como o muro entre dois quartos - não faz parte de nenhum deles. No processamento normal de awk , você vê registros que são linhas sem caracteres de nova linha - eles são removidos. Da mesma forma, na minha resposta, as seqüências quote-quote-quote-quote são removidas. Mas, como não há um separador de registros antes do primeiro registro ou após o último, os primeiros e últimos caracteres de aspas não são removidos.

Se você quiser processar o arquivo, um registro por vez, esta solução pode não ser boa o suficiente, porque o primeiro registro e os últimos registros são tratados de maneira diferente. Concordo (de certa forma) com a recomendação de Glenn de que, para qualquer trabalho sério, você deve usar um "analisador de CSV adequado".

    
por 13.01.2015 / 22:05
0

É altamente recomendável escolher um idioma com um analisador de CSV adequado. Eu gosto de ruby para isso, é muito conciso:

ruby -rcsv -e 'a = CSV.read(ARGV[0], :col_sep => ", "); puts a.length' file
7

Eu tive que modificar os separadores de colunas na linha de cabeçalho para adicionar espaços.

    
por 13.01.2015 / 04:15

Tags