단일 .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 단계 : in2csv를 사용하여 특정 시트를 .csv로 변환하는 코드는 다음과 같습니다.
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에만 출력을 제공하지만이 모든 시트를 얻는 방법을 모르겠습니다.
답변
다른 루프 안에 루프를 넣을 수 있습니다.
오류를 피하려면 결과 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
시트 당 하나의 파일 을 가져옵니다 .