Necesito convertir todas las hojas de un solo archivo .xls / .xlsx a un archivo .csv. Esto se hará en todos los archivos .xls en todos los directorios y subdirectorios (recursivamente).
Paso 1 : Obtenga los nombres de las hojas de todos los .xls en un .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
puede actuar como una lista:
sheetname1
sheetname2
sheetname3
Paso 2 : El código para convertir una hoja específica en un archivo .csv usando in2csv es:
in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv
¿Cómo puedo obtener cada nombre de hoja en un .xls / x y escribir cada hoja por separado para todos los directorios que contienen un .xls / x?
in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv ....
da salida solo en sheet1.csv, no estoy seguro de cómo obtener todas las hojas de esto.
command-line
csv
xls
csheth
fuente
fuente
find
cada.xls{,x}
y recorrer cada hoja usando-exec
?Respuestas:
Simplemente puede poner un bucle dentro de otro bucle.
Para evitar errores, no lo use
for
confind
resultados.fuente
.xls
in2csv --write-sheets "-" filename.xls > sheetname.csv
da solo la primera hoja. No sé qué información adicional agregar para escribir todas las hojas. Eso nos dará pistas para corregir su código.pip install csvkit -U
. Creo que la forma en que funciona no es lo que te gusta, con la simple skript de primera opción que tiene más formas de controlar la salida y el nombre de archivo, etc--write-sheets
Tal vez pueda configurar esta opción alternativa como otra respuesta ... A continuación, aceptaré la primera opción como respuesta. Gracias @RoVoSaltar encontrar y usar bash:
fuente
filename-{}.csv
no contiene datos. Soy un novato y parece que no puedo encontrar el error editando el script y leyendo. ¿Un poco de ayuda?xargs
. Corregido, no tan elegante ahora.xargs
y>
es malvado :-P. Es por eso que prefiero otro bucle, es menos propenso a errores.csvkit versión> 1.0.2 tiene una función integrada para escribir todas las hojas:
Entonces puedes probar lo siguiente:
Nota:
Esto parece no funcionar al 100% como se esperaba. Pero vale la pena intentarlo y como esta es la primera versión con esa opción, tal vez en futuras versiones la implementación sea mejor / más fácil.
fuente
Uso
Gnumeric
:para obtener un
csv
archivo por hoja.fuente