2020年1月26日日曜日

27: スプレッドシートをCSVファイルへ任意のフォーマットであなたのプログラムから

<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>

'値タブ区切り'、'固定長レコード'、'テキスト項目引用符付き'等フォーマットで書く、LibreOfficeまたはApache OpenOfficeおよびUNOを用いて。

話題


About: UNO (Universal Network Objects)
About: LibreOffice
About: Apache OpenOffice
About: Javaプログラミング言語
About: C++
About: Microsoft .NET Framework
About: Pythonプログラミング言語
About: LibreOffice Basic
About: Apache OpenOffice Basic
About: BeanShell
About: JavaScript

この記事の目次


開始コンテキスト



ターゲットコンテキスト



  • 読者は、任意のスプレッドシート(LibreOfficeまたはApache OpenOfficeでオープンできる任意のスプレッドシートドキュメントのもの)をCSVファイルへ任意のフォーマット(LibreOfficeまたはApache OpenOfficeで許されたもの)で自分のプログラムから書く方法を知る。
ト書き
Hypothesizer 7、Objector 27A、Objector 27Bがコンピューターの前にいる。


オリエンテーション


Hypothesizer 7
本記事では、私たちは、任意のスプレッドシートをCSVファイルへ任意のフォーマットで自分のプログラムから書く方法を知ります。

ご注意いただきたいのですが、ここで、「任意のスプレッドシート」は'LibreOfficeまたはApache OpenOfficeでオープンできる任意のスプレッドシートドキュメントの任意のスプレッドシート'を意味しています。...LibreOfficeまたはApache OpenOfficeは、典型的なスプレッドシートドキュメントフォーマットのほとんどに対処できますが、本記事に当てはまらない一部のフォーマットがあるかもしれません。

また、「任意のフォーマット」は'LibreOfficeまたはApache OpenOfficeで許された任意のフォーマット'を意味していることにもご注意ください。...LibreOfficeまたはApache OpenOfficeでは、'項目群が任意の文字で区切られた(よく使われるデリミターは'カンマ'および'タブ')'または'データ長が列毎に固定された'、'全テキスト項目が任意の文字でクウォートされた(よく使われるクウォーテイションマークは'ダブルクウォーテイション'および'シングルクウォーテイション')または'不可欠なクウォーテイションのみが付けられる(クウォーテイションマークについては同様)'、'フォーミュラの値が書かれる'または'フォーミュラ自体が書かれる'、'データが表示どおりに書かれる'または'データが格納されているとおりに書かれる'、'任意の文字エンコーディング'のフォーマットが許されますが、何か新奇なフォーマットを考えているのであれば、そのフォーマットは、本記事には当てはまらないかもしれません。

Objector 27A
「データが表示どおりに書かれる」、「データが格納されているとおりに書かれる」というのはどういう意味だ?

Hypothesizer 7
サー、例えば、あるセルは、小数、'1.234'を内部的に格納しており、'1.23'と表示されています。

Objector 27A
セルフォーマットがそうセットされているということか?

Hypothesizer 7
はい。その場合、上記フォーマットは、'1.23'が書かれるか'1.234'が書かれるかです。

Objector 27A
それじゃあ、スプレッドシートをCSVファイルに、'項目群がタブで区切られた'、'全テキスト項目がダブルクウォーテイションでクウォートされた'、'フォーミュラ自体が書かれる'、'データが格納されているとおりに書かれる'、'UTF8'フォーマットで書くには、'soffice --convert-to'にどんなパラメータを指定すればよいか言ってくれ。

Hypothesizer 7
えーと、それは私にはできません...

Objector 27A
はあ?私を馬鹿にしてるのかね?

Hypothesizer 7
いいえ、サー、決して私は...

Objector 27A
君は、「私たちは〜知ります」と言ったのに、今は「私にはできません」と言っている、私を馬鹿にしているということだ!

Hypothesizer 7
...気をお静めください、サー、'soffice --convert-to'を使うとは私は申しませんでした。

Objector 27A
はあ?もちろん、使うとも。

Hypothesizer 7
実のところ、使いません。

Objector 27A
ファイルをコンバートするときは、我々は'soffice --convert-to'を使う、いいな?

Hypothesizer 7
ああ、明らかに、あなたの仰る「我々」は私の言う「私たち」と異なっています。...確かに、あなたの仰る「我々」はご自分たちの裁量で'soffice --convert-to'を使うことができます。

Objector 27A
どうやって?

ト書き
Hypothesizer 7はため息をつく。

Hypothesizer 7
私は存じませんし、関心さえありません、正直なところ。...あなたがご存知なのでしょう?

Objector 27A
...何で私が知っていると思うのかね?

Hypothesizer 7
'soffice --convert-to'を推奨されているのは、それがあなたの望むことを行なえるとご存知だからではないのでしょうか?

Objector 27A
...私は別にそれを推奨していない、それが私に推奨されているのだ。

Hypothesizer 7
「推奨されている」?...なるほど。仰るとおりです。あなたのご質問に答える任務は、私は謙虚に、それを推奨されている方にお任せするべきでしょう。

Objector 27A
...

Objector 27B
私は、あるスプレッドシートドキュメントの全てのスプレッドシートのそれぞれをCSVファイルに特定のフォーマットで私のプログラムから書きたいんだけど。

Hypothesizer 7
マダム、それは容易に行なえます。

Objector 27B
本当?どんなパラメータを'soffice --convert-to'に渡せばいいの?

ト書き
Hypothesizer 7は肩を落とす。

Hypothesizer 7
存じません、マダム。

Objector 27B
「それは容易に行なえます」って言ったじゃない!

Hypothesizer 7
はい、そう申しましたし、それは本当です。

Objector 27B
それじゃあ、'soffice --convert-to'へのパラメータは何?

Hypothesizer 7
...'soffice --convert-to'をお使いになる必要がないのであれば、簡単な解決法(JavaC++C#PythonLibreOffice Basicでの実装。確かに、厳密には、それらは全スプレッドシートではなく恣意的な1スプレッドシートを書いていますが(P.S. ここに、全スプレッドシートを書くことについての記事があります)、解決法は明白でしょう)がありますが、もしも、'soffice --convert-to'を使う道義的、宗教的、または何らかの責務の下におられるのであれば、あなたのご質問に答える任務は、私は謙虚に、それを推奨されている方にお任せするべきでしょう。

Objector 27B
冗談でしょう!みんな'soffice --convert-to'を使うわよ!

Hypothesizer 7
...


本体


1: 注釈


Hypothesizer 7
本記事では、セットするべきドキュメント格納プロパティ群のみを紹介します。つまり、そのドキュメント格納プロパティ群を用いてどのようにドキュメントをファイルに格納するかには立ち入りません。ドキュメントファイルをコンバートすることについての以前の記事(コンセプトあるJava実装あるC++実装あるC#実装あるPython実装あるLibreOffice Basic実装)にその必要な情報が含まれています。


2: スプレッドシートドキュメントをCSVファイルに格納するためのフィルター名


Hypothesizer 7
スプレッドシートドキュメントをCSVファイルに格納するためのフィルター名は、'Text - txt - csv (StarCalc)'です。

そのフィルター名を'FilterName'プロパティにセットする必要があります。


3: 任意のCSVファイルフォーマットを指定するためにセットするべきドキュメント格納プロパティ


Hypothesizer 7
任意のCSVファイルフォーマットを指定するためにセットするべきドキュメント格納プロパティは、'FilterOptions'であり、これは、文字列値を取ります。

Objector 27A
「文字列値」?

Hypothesizer 7
例えば、'44,34,76,1,,0,true,true,true,false,false'です。

Objector 27A
はあ?一体全体、それはどういう意味だ?

Hypothesizer 7
フォーマットは、'%項目群デリミター文字コード%,%テキスト項目群クウォーテイションマーク文字コード%,%エンコーディングコード%,1,,0,%全テキスト項目がクウォートされるか%,false,%データは表示されたとおりに書かれるか%,%フォーミュラ自体が書かれるか%,false'となっています。

Objector 27A
..."1"、""、"0"、"false"、"false"という定数は何なのだ?

Hypothesizer 7
ダミーのようです、私の知る限り。つまり、例えば、それら"false"のうちのどれを'true'に変更しても、何も効果がないようです、私が気付く限り。

Objector 27A
それじゃあ、「エンコーディングコード」というのはどういう意味だ?

Hypothesizer 7
それは、使用されるエンコーディングを特定するコードという意味でして、例えば、UTF-8には'76'、UCS-2には'65535'、UCS-4には'65534'、US-ASCIIには'11'、EUC_JPには'69'、SHIFT_JISには'64'、等です。

Objector 27A
UCS-2は本当にUCS-2であって、UTF-16ではないのか?

Hypothesizer 7
実のところ、私は知りません。

Objector 27A
もしもエンコーディングがUCS-2(それが本当にUCS-2だとして)だとしたら、ある文字を項目群デリミターとするのに文字コードとしてどの値を指定すればいいのだ?

Hypothesizer 7
UCS-2(それが本当にUCS-2だとして)のコードを指定すればよいのです: 例えば、'U+3042'には'12354'。

Objector 27A
ああ。

Objector 27B
ある列データにフォーマットを指定できないわけ、例えば、各数値データに1000区切り文字を付けるように指定するとか?

Hypothesizer 7
そのフォーマットを対象セル群にセットし、その後、そのスプレッドシートをCSVファイルに'データは表示されたとおりに書かれるか'スイッチをオンにして格納すればよいのです。

Objector 27B
スプレッドシート自体は変更したくないんだけど!

Hypothesizer 7
一時的に過ぎません。その変更を元のファイルに格納する必要はないのです。

Objector 27B
...どうすれば、そのフォーマットを私のプログラムからセットできるの?

Hypothesizer 7
そのテーマに絞った記事はまだ私は書いていませんが、この4パーツ記事がそれを見つけるのに役に立つはずです('l_integerExpressionFormatString'が'#,##0'のようになるでしょう)。

Objector 27B
...どうすれば、ヘッダー行をCSVファイルから除外できるの?

Hypothesizer 7
ヘッダー行をそのスプレッドシートから取り除けばよいでしょう、一時的に。そうする方法は、ある記事に記載されています。

Objector 27B
...

Hypothesizer 7
UNO('soffice --convert-to'やサードパーティツールではなく)を直接に使用することの1つの大きなメリットは、あなたは自由に自分の望みどおりにドキュメントに手を加えられるということです。

Objector 27B
...'データ長が列毎に固定される'フォーマットでは各列長は自動的に決定されるんだと思うけど、各長さを私はどうやって知ることができるわけ?そのCSVファイルを読むためには、各長さを私は知らないといけないんだけど。

Hypothesizer 7
ああ、...いい質問ですね。...もしもヘッダ行が残っていれば、各列長は、ヘッダ行を分析することで知ることができるはずです。

Objector 27B
ええ。そうでなければ?

Hypothesizer 7
もしもそうでなければ、...ヘッダー行を除去するという計画をあなたは放棄してもよいでしょう。

Objector 27B
よくないわ!

Hypothesizer 7
それでは、あなたのプログラムでスプレッドシートを調査することで各長さを知ってもよいでしょう。

Objector 27B
...どうやって?

Hypothesizer 7
任意のセルのコンテンツをUNOを用いて読むのは容易なことです。


4: 結びとその先


Hypothesizer 7
これで、私たちは、任意のスプレッドシート(LibreOfficeまたはApache OpenOfficeでオープンできる任意のスプレッドシートドキュメントのもの)をCSVファイルへ任意のフォーマット(LibreOfficeまたはApache OpenOfficeで許されたもの)で自分のプログラムから書く方法を知りました。

しなければならないのは、適切なドキュメント格納プロパティ群を適切にセットすることだけです。

もしも、データに何らかの手を加えなければならないのであれば(数値を特定のフォーマットで表示しなければならない、ヘッダ行を取り除くか付け加えなければならない、一部の列を取り除かなければならない、等)、それは、スプレッドシートに対して自由に行なえます、UNOを介して。

任意のPDFフォーマットも私たちのプログラムから指定できますが、方法は、以降の記事で見ます。


参考資料


<このシリーズの前の記事 | このシリーズの目次 | このシリーズの次の記事>