誰しもそんな気分になる事はありますよね
一時期ドキュメント大臣みたいなことをやっていてですね、
ドキュメントつくりまくっていたんですが、
文言チェックにすごい工数を使っていました。
あのころは若干人海戦術も使えましたしね。
でも、まぁプログラマーなので、文言チェックを静的にチェックできないかなーと昔ツールをつくった時にしった
あれこれを作っていこうと思います。
対象チェック対象ファイルはodtでした。
OpenOfficeのwriterソフトです。
作りたいのは指定したフォルダにあるodtの書いてある文字をJavaで読み取って、
String.contents()判定をして含まれていればエラーにするってものですね。
xlsとかだとpoiって便利なライブラリがありますが、なかなか見つけられずこんな方法でやっていました。
■odtファイルはzip化して解凍すると色々いじくれる。
そのままStream系で読み込むことはできなかったので、違う手段を探していたところ、
「odtの中身はxmlファイル」
ということを知りました。
コレだ!と。
手元にodtファイルを用意して、拡張子をzipに変更します。
で変更したzipを解凍するとこんなファイル構成になっています。
これらがいい感じになって表示されているみたいです。
今回重要になるのは
content.xml
です。
ここにタグと一緒に文字が保存されています。
なのでコイツをよみとればいいわけです。
こんな感じでファイルを読み取れば解消です。
■折角なので一例。。。
こんな感じで動くんじゃないですかね
コピペしたらインデントが凄いことになりましたが、、、
public class XmlLoadDao {
public static final String CONTENT_FILE_NAME = “content.xml”;
public static final String STYLES_FILE_NAME = “styles.xml”;
public static List<String> handleOdtFile(File odtFile) throws FileNotFoundException, IOException, SAXException, ParserConfigurationException {
System.out.println(odtFile.getName());
List<String> returnList = new ArrayList<String>();
try (ZipInputStream zipStream = new ZipInputStream(new BufferedInputStream(new FileInputStream(odtFile)))) {
ZipEntry entry = null;
while ((entry = zipStream.getNextEntry()) != null) {
if (CONTENT_FILE_NAME.equals(entry.getName())) {
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
int b = 0;
while ((b = zipStream.read()) > 0) {
outStream.write(b);
}
outStream.flush();
outStream.close();
Document document = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new ByteArrayInputStream(outStream.toByteArray()));
search(odtFile.getName(), document, returnList);
}
}
}
return returnList;
}
private static void search(String file, Node node, List<String> returnList) {
if (node.getNodeName().startsWith(“text”)) {
returnList.add(node.getTextContent());
} else {
for (int i = 0; i < node.getChildNodes().getLength(); i++) {
search(file, node.getChildNodes().item(i), returnList);
}
}
}
}
■文字チェックの設計について
多分すぐ気づくことなんですが、
文言チェックの一覧作るじゃないですか。NGWordList的なもの。
こんな感じのテーブルをつくってます。
ID:ID
NG_WORD:ワード(使っちゃだめな文字列)
REVISION:改訂(こう書き換えるといいよ)
ALERT_LV:警戒レベル(0:絶対だめ、1:非推奨。条件付で使用可)
REMARKS:所見(駄目な理由)
MEMO:メモ、備考
で、コレともう一つ許可する用の機構を作っておくといいです。
例えばわかりやすい例では
「コンサル」は「コンサルタント」と略さないで書いて欲しいのでNG_WORDに「コンサル」と追加します。
でもそうすると「コンサルタント」にも「コンサル」の文字列が入っているのでNG対象になってしまいます。
「更に」を「さらに」と日本語で統一したいのでNG_WORDに追加します。
でも「変更になります」とかのチェックにも引っかかります。
こういったことを防ぐために、NG_WORDに引っかかったけど、
この単語であればOKみたいな機構を最初から想定しておいたほうがいいです。
こういったことはどんどんシステム化していきたいですねー
今ではこんな感じでチェックできますー
(直接打っても良いし、ドラッグドロップでもいける!)
コメント