Atualmente, estou trabalhando em uma classe que nos faz enviar nosso código para um auto-classificador e, em seguida, retorna nossos resultados. O formato que ele retorna é meio difícil de analisar visualmente, então eu gostaria de escrever um script que eu possa usar em um pipe para facilitar a leitura.
Aqui está a saída do auto-classificador:
Problem,Correct?,Correct Answer,Agent's Answer
"Challenge Problem B-04",0,4,-1
"Basic Problem B-12",0,1,-1
"Challenge Problem B-05",0,6,-1
"Challenge Problem B-07",0,6,-1
"Challenge Problem B-06",0,3,-1
"Basic Problem B-11",0,1,-1
"Basic Problem B-10",0,3,-1
"Challenge Problem B-03",0,3,-1
"Challenge Problem B-02",0,1,-1
"Challenge Problem B-01",0,6,-1
"Challenge Problem B-09",0,4,-1
"Challenge Problem B-08",0,4,-1
"Basic Problem B-08",0,6,-1
"Basic Problem B-09",0,5,-1
"Basic Problem B-04",0,3,-1
"Basic Problem B-05",0,4,-1
"Basic Problem B-06",0,5,-1
"Basic Problem B-07",0,6,-1
"Basic Problem B-01",0,2,-1
"Basic Problem B-02",0,5,-1
"Basic Problem B-03",0,1,-1
"Challenge Problem B-10",0,4,-1
"Challenge Problem B-11",0,5,-1
"Challenge Problem B-12",0,1,-1
{
"Basic Problems B": {
"Incorrect": "0",
"Skipped": "12",
"Correct": "0",
"Set": "Basic Problems B"
},
"Challenge Problems B": {
"Incorrect": "0",
"Skipped": "12",
"Correct": "0",
"Set": "Challenge Problems B"
}
}
É uma mistura de valores separados por vírgula e JSON. Seria bom colocar tudo isso em uma mesa bonita que eu possa ler.
Atualmente, tenho algo como
python submit.py --provider gt --assignment error-check | column -t -s, | less -S
Quais saídas:
{
"Basic Problems B": {
"Incorrect": "0",
"Skipped": "12",
"Correct": "0",
"Set": "Basic Problems B"
},
"Challenge Problems B": {
"Incorrect": "0",
"Skipped": "12",
"Correct": "0",
"Set": "Challenge Problems B"
}
}
Problem Correct? Correct Answer Agent's Answer
"Challenge Problem B-04" 0 4 -1
"Basic Problem B-12" 0 1 -1
"Challenge Problem B-05" 0 6 -1
"Challenge Problem B-07" 0 6 -1
"Challenge Problem B-06" 0 3 -1
"Basic Problem B-11" 0 1 -1
"Basic Problem B-10" 0 3 -1
"Challenge Problem B-03" 0 3 -1
"Challenge Problem B-02" 0 1 -1
"Challenge Problem B-01" 0 6 -1
"Challenge Problem B-09" 0 4 -1
"Challenge Problem B-08" 0 4 -1
"Basic Problem B-08" 0 6 -1
"Basic Problem B-09" 0 5 -1
"Basic Problem B-04" 0 3 -1
"Basic Problem B-05" 0 4 -1
"Basic Problem B-06" 0 5 -1
"Basic Problem B-07" 0 6 -1
"Basic Problem B-01" 0 2 -1
"Basic Problem B-02" 0 5 -1
"Basic Problem B-03" 0 1 -1
"Challenge Problem B-10" 0 4 -1
"Challenge Problem B-11" 0 5 -1
"Challenge Problem B-12" 0 1 -1
Isso me leva a maior parte do caminho até lá. Agora eu estou querendo saber se existe uma maneira que eu possa lidar com o JSON?
Não posso confiar em dividir a saída em um determinado número de linha, mas estou pensando que posso segmentar a saída quando encontrar um arquivo {
.
Eu gostaria de fazer isso o mínimo possível para que eu possa compartilhá-lo com os colegas. Portanto, quanto menos dependências, melhor.
Eu vi outras postagens de análise JSON sugerindo o uso de códigos externos.
Uma saída ideal seria algo como:
Problem Correct? Correct Answer Agent's Answer
"Challenge Problem B-04" 0 4 -1
"Basic Problem B-12" 0 1 -1
"Challenge Problem B-05" 0 6 -1
"Challenge Problem B-07" 0 6 -1
"Challenge Problem B-06" 0 3 -1
"Basic Problem B-11" 0 1 -1
"Basic Problem B-10" 0 3 -1
"Challenge Problem B-03" 0 3 -1
"Challenge Problem B-02" 0 1 -1
"Challenge Problem B-01" 0 6 -1
"Challenge Problem B-09" 0 4 -1
"Challenge Problem B-08" 0 4 -1
"Basic Problem B-08" 0 6 -1
"Basic Problem B-09" 0 5 -1
"Basic Problem B-04" 0 3 -1
"Basic Problem B-05" 0 4 -1
"Basic Problem B-06" 0 5 -1
"Basic Problem B-07" 0 6 -1
"Basic Problem B-01" 0 2 -1
"Basic Problem B-02" 0 5 -1
"Basic Problem B-03" 0 1 -1
"Challenge Problem B-10" 0 4 -1
"Challenge Problem B-11" 0 5 -1
"Challenge Problem B-12" 0 1 -1
Set Incorrect Skipped Correct
Basic Problems B 0 12 0
Challenge Problems B 0 12 0
Separar o JSON do resto é bem fácil. Isso fornecerá apenas o não JSON:
E isso, apenas o JSON:
Para ilustrar, salvei sua entrada de exemplo como
file
e:E
Agora, você já lida perfeitamente bem com o não-JSON, então não vou mudar isso. Idealmente, os dados JSON devem ser analisados usando um analisador JSON, como
jq
. Infelizmente, não sei o suficientejq
para fazer isso corretamente, então o melhor que consegui foi essa solução, bastante deselegante. Pelo menos ele faz o que você quer (substituacat file
pelo seupython submit.py --provider gt --assignment error-check
comando:Colocar tudo isso junto em um script de shell fornece:
Que produz a seguinte saída:
Parece hacky, e espero que alguém possa encontrar uma solução mais limpa com analisadores JSON dedicados.
O Steeldriver foi bom o suficiente para fornecer uma
jq
solução adequada em um comentário, então, se incorporarmos isso, obteremos o muito mais simples (e seguro):Usando Miller ( https://github.com/johnkerl/miller ) e executando
voce terá
.