내 디렉터리에는 약 16,000개의 .xlsx 파일이 있습니다. 각 파일은 동일한 구조를 따릅니다. 첫 번째 테이블은 비어 있으며 "테이블 1"이라고 합니다. 두 번째는 흥미로운 데이터가 있는 곳으로 "파트너"라고 합니다. text/csv로 변환해야 합니다.
ssconvert, xlsx2csv를 포함하여 온라인에서 찾은 다양한 솔루션을 시도했는데 둘 다 런타임 오류가 발생했습니다. 또한 내 파일이 손상되었는지(그리고 파일이 제대로 열렸는지) 확인하기 위해 Libre Office Calc에서 만든 더미 파일을 사용하여 이러한 작업을 시도했습니다.
어떻게 해야 하나요?
답변1
LibreOffice에는 csv로 변환하는 기능이 내장되어 있습니다.
localc --headless --convert-to csv input.xlsx
그러나 이렇게 하면 첫 번째 시트만 내보내집니다. 두 번째 시트를 얻으려면 매크로의 도움이 필요합니다. LibreOffice Calc를 열고 로 이동합니다 Tools -> Macros -> Edit Macros
.
그러면 편집기가 열리고 편집기에 있는 내용을 다음 코드로 바꿉니다.
REM ***** BASIC *****
Sub Main
sheets = ThisComponent.Sheets
sheets.removeByName("Sheet1")
ThisComponent.storeSelf(Array())
ThisComponent.close(true)
End Sub
그런 다음 매크로( ctrl+s
)를 저장합니다. Standard.Module1.Main
(왼쪽 하단에 표시됨) 에 저장해야 합니다 .
그런 다음 LibreOffice를 다시 닫고 다음 명령을 실행할 수 있습니다.
localc --headless input.xlsx macro:///Standard.Module1.Main
이렇게 하면 첫 번째 시트가 삭제됩니다( Sheet1
코드를 변경해야 하는 경우 이름이 지정된 모든 시트).
따라서 Bash 스크립트는 다음과 같이 보일 수 있습니다.
mkdir csvs
for i in *.xlsx ; do
localc --headless $i macro:///Standard.Module1.Main
localc --convert-to csv $i
done
mv *.csv csvs/
답변2
csvkit(https://csvkit.readthedocs.io/en/latest/) 그리고 실행
in2csv -I --sheet "sheetName" ./input.xlsx >./output.csv
bash for 루프를 작성하는 것은 당신에게 달려 있습니다.