Preciso converter todas as planilhas de um único arquivo .xls / .xlsx em um .csv. Isso será feito em todos os arquivos .xls em todos os diretórios e subdiretórios (recursivamente).
Etapa 1 : obtenha os nomes de planilha de todos os .xls em um .csv usando:
for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done
filename-sheetnames-list.csv
pode atuar como uma lista:
sheetname1
sheetname2
sheetname3
Etapa 2 : o código para converter uma planilha específica em um .csv usando o in2csv é:
in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv
Como posso obter todos os nomes de folhas em um arquivo .xls / xe escrever cada folha separadamente para todos os diretórios que contêm um arquivo .xls / x?
in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv ....
fornece saída apenas em sheet1.csv, não sabe como obter todas as folhas disso.
command-line
csv
xls
csheth
fonte
fonte
find
todos.xls{,x}
e repetir cada folha usando-exec
?Respostas:
Você pode simplesmente colocar um loop dentro de outro loop.
Para evitar erros, não use
for
comfind
resultados.fonte
.xls
in2csv --write-sheets "-" filename.xls > sheetname.csv
fornece apenas a primeira folha. Não sei quais informações adicionais adicionar para escrever todas as folhas. Isso nos dará pistas para corrigir seu código.pip install csvkit -U
. Eu acho que a forma como ele funciona não é o que você gosta, com o simples skript partir de 1º de opção que você tem mais maneiras de controlar a saída e os nomes de arquivos etc.--write-sheets
talvez Você possa definir essa opção alternativa como outra resposta ... Aceitarei a primeira opção como resposta então. Obrigado @RoVoIgnorando a localização e o uso do bash:
fonte
filename-{}.csv
não contém dados. Sou iniciante e não consigo encontrar o erro editando o script e lendo. Alguma ajuda?xargs
. Corrigido, não tão elegante agora.xargs
e>
é mau :-P. É por isso que prefiro outro loop, é menos propenso a erros.A versão do csvkit> 1.0.2 possui uma função interna para escrever todas as folhas:
Então você pode tentar o seguinte:
Nota:
Isso parece não funcionar 100% conforme o esperado. Mas vale a pena tentar e, como esta é a primeira versão com essa opção, talvez nas versões futuras a implementação seja melhor / mais fácil.
fonte
Use
Gnumeric
:para obter um
csv
arquivo por folha.fonte