私のディレクトリには約16,000個の.xlsxファイルがあります。各ファイルは同じ構造に従います。最初のテーブルは空で、「テーブル1」と呼ばれます。 2つ目は興味深いデータがあるところで「パートナー」と呼ばれます。 text/csvに変換する必要があります。
ssconvert、xlsx2csvなど、オンラインで見つけたさまざまなソリューションを試しましたが、どちらもランタイムエラーが発生しました。また、私のファイルが破損していること(そしてファイルが正しく開かれているかどうか)を確認するために、Libre Office Calcによって作成されたダミーファイルを使用してこれらの作業を試みました。
どうすればいいですか?
答え1
LibreOfficeにはcsvに変換する機能が組み込まれています。
localc --headless --convert-to csv input.xlsx
ただし、これにより最初のシートのみがエクスポートされます。 2枚目のシートを入手するには、マクロの助けが必要です。 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 ループを書くことはあなた次第です。