Преобразование таблиц.xls/.xlsx в несколько.csv на основе списка
Мне нужно преобразовать все листы одного файла.xls/.xlsx в.csv. Это будет сделано для всех файлов.xls во всех каталогах и подкаталогах (рекурсивно).
Шаг 1: Получить имена листов всех.xls в.csv, используя:
for file in $(find . -name '*.xls' -o -name '*.xlsx');do in2csv -n "$file" > ${file%.xls}-sheetnames-list.csv; done
filename-sheetnames-list.csv может выступать в качестве списка:
sheetname1
sheetname2
sheetname3
Шаг 2: Код для преобразования определенного листа в.csv с использованием in2csv:
in2csv --sheet "SHEETNAME" filename.xls > filename-SHEETNAME.csv
Как я могу получить каждое имя листа в.xls/x и написать каждый лист отдельно для всех каталогов, содержащих.xls/x?
in2csv --write-sheets "-" filename.xls > filename-sheet1.csv filename-sheet2.csv .... дает вывод только на sheet1.csv, не уверен, как получить все листы из этого.
4 ответа
Вы можете просто поместить цикл в другой цикл.
Чтобы избежать ошибок, не используйте for с find Результаты.
while IFS= read -r file; do
while IFS= read -r sheet; do
in2csv --sheet "$sheet" "$file" > "${file%.*}-${sheet}.csv"
done < <(in2csv -n "$file")
done < <(find . -name '*.xls' -o -name '*.xlsx')
Пропуск поиска и использование bash:
shopt -s globstar # enable recursive globbing
for f in **/*.xls{,x} # for files ending in .xls or .xlsx
do
in2csv -n "$f" | # get the sheetnames
xargs -I {} bash -c 'in2csv --sheet "$2" "$1" > "${1%.*}"-"$2".csv' _ "$f" {} # {} will be replaced with the sheetname
done
Версия CSVKIT> 1.0.2 имеет встроенную функцию для записи всех листов:
--write-sheets: WRITE_SHEETS
The names of the Excel sheets to write to files, or
"-" to write all sheets.
Таким образом, вы можете попробовать следующее:
find . -name '*.xls' -o -name '*.xlsx' -exec in2csv --write-sheets "-" {} \;
Замечания:
Кажется, это не работает на 100%, как ожидалось. Но стоит попробовать, так как это первая версия с таким вариантом, возможно, в будущих версиях реализация будет лучше / проще.
Использование Gnumeric:
ssconvert -S filename.xlsx filename.csv
чтобы получить один csv файл на листе.