Solução Python
O pequeno script abaixo pega o argumento de linha de comando, faz uma iteração sobre cada linha desse arquivo e divide cada linha na lista de itens usando ,
como separador. Cada entrada é, então, sem aspas e verificada por ser uma string numérica; se uma string for numérica, ela será deixada sem aspas.
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fp:
for line in fp:
new_vals = []
vals = line.strip().split(',')
for val in vals:
val = val.strip().rstrip().replace('"','')
if not val.isdigit():
val = '"' + val + '"'
new_vals.append(val)
print(",".join(new_vals))
Execução de teste:
$ cat input.txt
"34432", "name", "0", "very long description"
"1234", "othe name" , "42", "another description"
$ ./unquote_integers.py input.txt
34432,"name",0,"very long description"
1234,"othe name",42,"another description"
Notas adicionais :
Foi perguntado nos comentários, porque o script remove as aspas duplas em torno de cada item antes de avaliar se o item é uma string numérica ou não. A principal razão para isso é que a inclusão de aspas duplas fará com que um item como "123"
avalie para False
, ou seja, não numérico. Efetivamente, precisamos avaliar o que está dentro das aspas duplas de alguma forma. Agora, existe uma maneira alternativa de abordar isso usando a lista de fatias de cada valor. No entanto, isso não é melhor do que usar .replace()
desde o início. Ele torna o código mais curto, mas, pelo menos nesse caso, a falta de um script é irrelevante - nosso objetivo é fazer o código funcionar, não codificá-lo com códigos.
Veja a solução alternativa com fatias de lista:
#!/usr/bin/env python
import sys
with open(sys.argv[1]) as fp:
for line in fp:
new_vals = []
vals = line.strip().split(',')
for val in vals:
val = val.strip().rstrip() #remove extra spaces
val = val.replace('"','') if val[1:-1].isdigit() else val
new_vals.append(val)
print(",".join(new_vals))