Como verificar campos nulos no arquivo CSV?

3

Meu arquivo CSV será parecido com este (separado por pipe):

apple|banana|pear||grapefruit
lemon|lime|damson|jackfruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

(Suponha que qualquer tipo de espaço em branco ou caracteres especiais possam estar nos campos individuais.)

Tenho que verificar se algum valor em qualquer coluna é nulo, incluindo a primeira e a última colunas.

Resultado esperado:

apple|banana|pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

Como posso fazer isso?

    
por SinghChan 10.11.2016 / 10:07

4 respostas

2

Como mencionado em um comentário , a resposta fácil e óbvia seria grep '||' , mas isso falharia em detectar casos em que a primeira ou última coluna é nula.

Portanto, a resposta correta (ainda usando grep ) é:

grep '^|\|||\||$' file.txt

O caractere | não é especial para o Grep, a menos que seja escapado com uma barra invertida, ou a menos que a opção -E seja especificada. Ainda assim, isso é um pouco incerto, então vamos ver como seria se o delimitador no arquivo fosse uma vírgula :

grep '^,\|,,\|,$' file.txt

Se você quiser omitir as linhas em que apenas o campo último é nulo, mas as linhas de impressão em que qualquer outro campo é nulo, apenas omita o último caso:

grep '^|\|||' file.txt

Na verdade, é mais fácil ver o que está acontecendo se você colocar os casos individuais em argumentos separados, assim:

grep -e '^|' -e '||' -e '|$' file.txt 
    
por 10.11.2016 / 10:48
0

Isso encontrará campos nulos, incluindo o primeiro e o último campo.

awk -F\| '{for(i=1;i<=NF;i++) if($i=="") { print $0; next } }' file.csv > out.txt
    
por 10.11.2016 / 10:12
0

Você pode tentar isso com o awk. Ele irá imprimir o número da linha de uma partida.

$ awk  '/^\|/ || /\|\|/ || /\|$/{print $0}' input_test 
apple|banana|pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

Com base em suas revisões para a pergunta original, eu refiz o comando awk.

Explicação: Awk irá corresponder a uma das três condições

  • / \ | \ | / corresponderá a qualquer campo nulo que não seja o primeiro ou o último campo.
  • / ^ \ | / corresponderá a qualquer campo nulo no início de uma linha - o "^".
  • / \ | $ / corresponderá a qualquer campo nulo no final de uma linha - o "$".

Como o awk reconhece | como operador, quando tentamos combinar um "|" precisamos usar um "\" na frente dele.

Agora, essas três condições são combinadas com um "||" qual awk interpreta como "ou". Então, quando uma dessas três condições for correspondida, toda a linha será impressa.

Para corresponder a uma coluna específica como nula, você pode usar

awk -F"|" '!length($1) || !length($4) {print $0} ' input_test
    
por 10.11.2016 / 10:18
0

Usando Miller :

$ cat pipe.dat
apple|banana||pear||grapefruit
lemon|lime|damson|jackfruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|

$ cat has-blanks.mlr
@has_empty = false;
for (k,v in $*) {
    if (v == "") {
        @has_empty = true;
        break;
    }
}
filter @has_empty;

$ cat pipe.dat | mlr --nidx --fs pipe put -f has-blanks.mlr
apple|banana||pear||grapefruit
|tangerine|nectarine|plum
apricot|orange|pineapple|coconut|
    
por 11.11.2016 / 16:06