• 会社案内
  • 事業内容
  • 事業実績
  • ブログ・SNS
  • スタッフ募集
  • 校正学校
  • お問い合わせ
<< イチロー | main | 第一回「かもめの本」(その7) >>
1. テキストファイル(CSVファイル)を開く
「OpenOffice.org」をご存じでしょうか。
「Microsoft Office」との互換性を持つ、
ワープロや表計算などを統合したオフィスソフトです。
しかもタダ!(松本零士センセ風)

「OpenOffice.org」は、
「オープンオフィス」「OOo(オーオーオー)」
なんて読みます。

公式サイトはこちらです。
ダウンロードもこちらから出来ます。

「Microsoft Office」との互換性を謳ってはいますが、
鴎来堂の場合、著者先生の原稿をお預かりするので、
万が一がを想定して、同じアプリケーションで開くようにしています。

「Word」原稿は「Word」で、
「一太郎」原稿は「一太郎」で、
「WinのInDesign」ゲラは「WinのInDesign」で開くようにしています。

お客さんのご都合があるので、
複数のプラットホームを無くすことは出来ないのですが、
「OOo」はどんどん便利になってきているので、
鴎来堂では通常業務を「OOo」に移行していこうと思っています。
「OOo」のロゴにかもめが飛んでいるのも鴎来堂向きですよね。


さて、コンピュータはかわいい奴です。
うまく使える場面で、うまく使うと、うまいこと仕事がはかどります。

校正の王道は校正者の職人技なのですが、
やっぱり昨今コンピュータに頼る場面も多いですね。

鴎来堂では「一太郎」や「Excel」などの「マクロ」を使って、
校正のいろんな場面で省力化をしてきました。
(テキストのデータ処理なら鴎来堂にお任せください)


で、「OOo Calc」(Microsoft OfficeにおけるExcel」でも
同じようなことがやりたくなりますよね。
表側が同じようにみえるので、
ExcelでVBAがいじれれば何とかなるだろうと思ったらそれが大間違い。
違うシートを参照するだけでも関数が違ったりして、結構苦労しました。

といっても苦労したのは僕じゃなくって、
鴎来堂理系頭脳のトップ、イソベ氏です。

彼が言うには、
「とにかく資料の絶対数がたりない」とのこと。

たとえば、
OOoBasicの基本事項についてはこちらのサイトがおすすめです。
OpenOffice.org Basic 研究室

「OpenOffice.org Basic」(OOoBasic)では、
素晴らしいサイトもありますが、
もっと有志がいてもいいですよね。

鴎来堂ブログでも、OOoを盛り上げるため、
不定期に実戦的なソースを載っけていきます。

軽佻浮薄を身上とする僕の文章とは逆に、
骨太のイソベレポートにメロメロだ!!


===以下イソベレポート======================
OOoのCalcでカンマ区切りのテキストファイルを開くマクロを作ってみます。


* * *


まずはExcel(VBA)でのコード例です。

Workbooks.OpenText FileName:="C:¥Data¥File1.txt", StartRow:=2, _
DataType:=xlDelimited, Comma:=True, Tab:=False, _
TextQualifier:=xlDoubleQuote, _
FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2))

引数の意味を簡単に記しておきます。



FileName:="C:¥Data¥File1.txt"

読み込むファイルのファイル名。



StartRow:=2

2行目のデータから読み込む。



DataType:=xlDelimited

各行は区切り文字(デリミタ)で区切られている。



Comma:=True, Tab:=False

カンマを区切り文字にする。
タブ(デフォルトで有効になっている)は区切り文字にしない。



TextQualifier:=xlDoubleQuote

文字列の引用符はダブルクォート。



FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2))

1列目と2列目は標準のセル書式で、3列目は文字列として読み込む。


* * *


さて、上のコードがCalc(OOoBasic)だとこうなります。

Dim aFileProperties(1) As New com.sun.star.beans.PropertyValue

aFileProperties(0).Name = "FilterName"
aFileProperties(0).Value = "Text - txt - csv (StarCalc)"
aFileProperties(1).Name = "FilterOptions"
aFileProperties(1).Value = "44,34,0,2,1/1/2/1/3/2"

StarDesktop.loadComponentFromURL(ConvertToUrl("C:¥Data¥File1.txt"), _
"_blank", 0, aFileProperties())

VBAで意味上は1行のステートメントが、OOoBasicでは変数の宣言を除いても5行に増えています。OOoBasicではよくあるパターンで、「メソッドが動作するときのオプションを前もって変数に設定しておいて、メソッドを呼び出すときにその変数を引数として渡す」という手法です。

この場合だと、aFileProperties()という配列変数(構造体の配列)を用意して、これのNameメンバーに「設定の種類」を表す文字列を、Valueメンバーに「設定値」を表す文字列を入れています。そしてこのaFileProperties()を、ドキュメントを開くためのloadComponentFromURLというメソッドの4つ目の引数にするわけです。

では、その設定の部分を見ていきます。



aFileProperties(0).Name = "FilterName"
aFileProperties(0).Value = "Text - txt - csv (StarCalc)"

この2行は、開くファイルがテキストファイルであることを表しています。"Text - txt - csv (StarCalc)" という文字列は正確にこの通りにしなければなりません。



aFileProperties(1).Name = "FilterOptions"
aFileProperties(1).Value = "44,34,0,2,1/1/2/1/3/2"

この2行で読み込み方法の詳細な設定をしています。この暗号のような "44,34,0,2,1/1/2/1/3/2" という文字列の意味を、カンマで分けられた部分ごとにVBAと対応させながら解読してみます。



44

区切り文字のASCIIコードです。
カンマは44、タブは9、セミコロンは59、スペースは32。
◆VBAの DataType:=xlDelimited, Comma:=True に相当

連続した区切り文字を1文字として扱うときは /MRG を付けます。
(例:カンマの場合 44/MRG)
◆VBAの ConsecutiveDelimiter:=True に相当

また、区切り文字が複数あるときは / に続けて書き加えます。
(例:カンマかセミコロンなら 44/59)

※データが固定長で区切られている(◆VBAの DataType:=xlFixedWidth)ときは、ここを FIX とします。詳しくは一番下の補足を参照してください。



34

文字列の引用符のASCIIコードです。
ダブルクォートは34、シングルクォートは39、ない場合は省略。
◆VBAの TextQualifier:=xlDoubleQuote に相当



0

文字コードセットの指定です。
0でOSの標準の文字コードセットを使用します。
Unicode(UTF-16)は65535、UTF-7は75、UTF-8は76、EUC-JPは69、ISO-2022-JPは72、Shift_JISは64。
◆VBA(Excel2002以降)の Origin:=932 などに相当



2

2行目のデータから読み込みます。
◆VBAの StartRow:=2 に相当



1/1/2/1/3/2

列ごとに書式を指定します。
列番号/書式/列番号/書式/・・・という風に書きます。
この例の場合、
1列目は標準の書式で(→ 1/1)
2列目も標準の書式で(→ 2/1)
3列目は文字列として(→ 3/2)
読み込む、という意味です。
標準は1、文字列は2、MDY形式の日付は3、DMY形式の日付は4、YMD形式の日付は5、無視する(読み込まない)列は9。
◆VBAの FieldInfo:=Array(Array(1, 1), Array(2, 1), Array(3, 2)) に相当
 VBAと同様に、指定しなかった列は標準で読み込まれる


* * *


※補足

・ExcelでCSVファイルを開くとき

Excelでファイルの拡張子が.csvのファイルを開くと、テキストファイル・ウィザードが起動せず、勝手にすべての列が標準の書式で読み込まれてしまいます。VBAのOpenTextメソッドでも引数のFieldInfoが有効にならないので、やはり全列が標準の書式で読み込まれます。FieldInfoを使いたいときは、名前変更するなりコピーするなりして拡張子が.csvでないファイルを用意する必要があります。



・文字列の引用符(TextQualifier)について

文字列の引用符とは「文字列を囲っているかもしれない記号」のことです。
例えば、カンマ区切りのテキストファイルの
ABC,"DEF,GHI",JKL
という行を読み込むと、TextQualifier の指定によって結果に次のような違いが出ます。

TextQualifier:=xlDoubleQuote のとき
列1:ABC  列2:DEF,GHI  列3:JKL

TextQualifier:=xlNone のとき
列1:ABC  列2:"DEF  列3:GHI"  列4:JKL



・固定長のデータを読み込むOOoBasicのコード

データが固定長で区切られているときは、例の暗号のような文字列の最初の部分(区切り文字のASCIIコードを指定する所)に FIX と入れます。書式の指定は 位置/書式/位置/書式/・・・という風に書きます。
例えば、
DataType:=xlFixedWidth, FieldInfo:=Array(Array(0, 2), Array(10, 9), Array(15, 1))
に対応する「暗号」は、
"FIX,,0,1,0/2/10/9/15/1"
となります。

===以上イソベレポート======================

ね、骨太でしょ。
次回の予定が決まったら、またお知らせしますね。

*ソースはイソベ氏のオリジナルです。
参考にするときは「イソベさんありがとう!」
と口にしてから使ってあげてください。

*鴎来堂ブログは横幅が狭いので、
ちょっと見にくいかもしれません。
ソースはテキストエディタなどで見るとよいですね。



文責:磯部・鵬

このブログは神楽坂の校正・校閲プロダクション鴎来堂(おうらいどう)が運営しています
URL:http://www.ouraidou.net/



鴎来堂では校正者を募集しています
[1]在宅校正者:一般書籍(文芸・実用)の校正・校閲・原稿整理
[2]派遣校正者:都内出版社・印刷所への出張校正
[3]OCRオペレータ:電子書籍関連業務 校正、タグ修正など
[4]内勤(アルバイト):事務作業、ゲラ(校正刷り)配達等の手伝い
[5]DTPオペレータ:在宅、内勤問わず
募集フォームよりお申し込みください
※[3][4]は定員に達した為、現在募集を見合わせております
URL:http://www.ouraidou.net/form.htm/

| blog-ouraidou | OpenOffice.org | 20:54 | comments(1) | trackbacks(0) |
OOo BASICでCSV読み込みマクロを書こうと思ったのですが、資料をなかなか見つけることができず苦労していました。
こちらの解説は大変参考になります。
(イソベさん、ありがとうございます!)(^o^)

FilterName、FilterOptionsで使用できるパラメータはどこで公開されているのでしょうか? ご教示いただけると幸いです。
| げえさん | 2009/07/02 6:09 PM |










http://blog.ouraidou.net/trackback/807622
      1
2345678
9101112131415
16171819202122
23242526272829
30      
<< June 2019 >>
_