Quero adicionar uma coluna com um "número de caso" criado aleatoriamente ao meu csv
arquivo. As primeiras 2 letras do número do caso devem ser qualquer letra de AZ em maiúscula. seguido por 5 números aleatórios.
entrada:
COMPANY,NAME,STREET,ZIP,CITY,IBAN
Test Ltd,John,Big Ben 343,4343,London,UK2348020384
Test Ltd,Kate,Big Ben 343,4343,London,UK4389223892
Test Ltd,Jake,Big Ben 343,4343,London,UK3892898999
saída
COMPANY,NAME,STREET,ZIP,CITY,IBAN,CASENUMBER
Test Ltd,John,Big Ben 343,4343,London,UK2348020384,IN84903
Test Ltd,Kate,Big Ben 343,4343,London,UK4389223892,TY93842
Test Ltd,Jake,Big Ben 343,4343,London,UK3892898999,OL34307
Como fazer isso com o moleiro? Eu tenho o seguinte comando pronto
mlr -I --csv put '${CASENUMBER}=xxx' then \
reorder -f COMPANY,NAME,STREET,ZIP,CITY,IBAN,CASENUMBER input/input.csv
O que adicionar exatamente ao comando acima?
Isso não usa Miller (principalmente porque não consegui encontrar uma maneira conveniente de usar caracteres aleatórios), mas GNU Awk:
Este comando GNU Awk extrai a
ord()
função daord.awk
biblioteca (que é distribuída junto com o GNU Awk) para poder converter entre um caractere e sua representação ASCII. Em seguida, ele inicializa o gerador de números aleatóriossrand()
e pré-calcula os valores ASCII para as letrasA
eZ
por conveniência.Se o registro atual for o primeiro registro (ou seja, for o cabeçalho CSV), ele será gerado com a string
,CASENUMBER
anexada.Para todos os outros registros, ele gera o registro original com uma string anexada após uma vírgula. A string é calculada como dois caracteres e um número preenchido com zero. Os dois caracteres são escolhidos no intervalo
[A,Z]
e o número é escolhido no intervalo[0,100000)
. A seleção aleatória de números inteiros de um intervalo é feita usando arandint()
função, que estou usando sem modificações no manual do GNU Awk .Um exemplo de saída da execução disso nos dados fornecidos:
Observe que, desde que assumamos que nenhum campo contém novas linhas incorporadas, não precisamos realmente analisar os dados de entrada. Com essa suposição, basta anexar novos dados ao final de cada linha.
terdon apontou nos comentários que pode ser uma boa ideia garantir que os IDs de casos computados sejam exclusivos. Isso é feito controlando os IDs já gerados em uma matriz associativa chamada
seen
:Também movi a criação do ID do caso aleatório para uma função própria, pois precisamos chamá-lo duas vezes na parte principal do código.
Você poderia usar
urandint
para escrever um gerador de caracteres aleatórios rápido e sujo usando o fatiamento de strings:Uma maneira de fazer isso em Miller.
Voce terá
Com
perl
:Isso pressupõe que os campos CSV não contenham caracteres de nova linha. Se possível, você pode usar
Text::CSV
o módulo do Perl para fazer a análise e formatação adequada de CSV, como Miller faz.Usando qualquer awk: