読者です 読者をやめる 読者になる 読者になる

CSV形式索引のフォーマット変換

前回までのあらすじ。

PDFIndexViewerを作って、それなりに使えることに満足した akiyuki。

しかし肝心の AL2のCSV形式索引をそのまま使用することが出来ず、さらなるひと手間が必要になるのだった。

というのも。提供フォーマットは

名称,読み,『書籍』,頁1,頁2,頁3,頁4,頁5,発売日

で、以下の様に、同一用語に対して、複数参照ページがあったり

FS判定管理シート,FSはんていかんりシート,『ALA』,31,202,,,,2012/9/20

以下の様に、複数の書籍に、同一用語がある場合は2行になったり、

FC社,FCしゃ,『AL2』,303,,,,,2012/8/10

FC社,FCしゃ,『ALA』,125,,,,,2012/9/20

で、1用語に対する参照ページのデータが散逸しているため、プログラムで処理するには、ちょっと処理が面倒だし、個人的に気持ち悪いフォーマットなのです。

なので

#名称,読み,頁

とフォーマットを変換するVBScriptをちょろっと書いてみました。

convert.vbs

Option Explicit

' AL2インデックスフォーマット変換
'
' 使い方:al2_dgidx.csvと本ファイルを同一フォルダにおいて、本ファイルを実行(ダブルクリック)

Dim objFSO
Set objFSO = WScript.CreateObject("Scripting.FileSystemObject")
If Err.Number <> 0 Then
    WScript.Echo "エラー: " & Err.Description
    WScript.Quit
End If

Dim objFileInput
Set objFileInput = objFSO.OpenTextFile("al2_dgidx.csv")
If Err.Number <> 0 Then
    WScript.Echo "ファイルオープンエラー: " & Err.Description
    WScript.Quit
End If

Dim objFileOutput
Set objFileOutput = objFSO.OpenTextFile("AL2Index.csv", 2, True)
If Err.Number <> 0 Then
    WScript.Echo "ファイルオープンエラー: " & Err.Description
    WScript.Quit
End If
objFileOutput.WriteLine( "#名称,読み,頁 ※文字コードをUTF-8に変換すること" )    'ヘッダーを出力

Dim isFirst : isFirst = true
Dim aryReadLine
Dim i   'ループカウンタ
Do While objFileInput.AtEndOfStream <> True
    aryReadLine = Split(objFileInput.ReadLine, ",") '一行読み込んで、カンマ区切り
    If isFirst = false And Len(aryReadLine(2)) <> 0 Then        '先頭行、および『書籍』未設定の場合は読み飛ばす
        For i=3 To 7
            If Len(aryReadLine(i)) <> 0 Then
                '「名称、読み、書籍+頁n」を出力
                objFileOutput.WriteLine( aryReadLine(0) & "," &  aryReadLine(1) & "," & aryReadLine(2) & " " & aryReadLine(i) )
            End If
        Next
    End If
    isFirst = false
Loop

objFileOutput.Close
objFileInput.Close

Set objFileOutput = Nothing
Set objFileInput = Nothing
Set objFSO = Nothing

WScript.Echo "変換終了"
WScript.Quit

ちなみに Windowsマシンでちょっとしたファイル整形を行なう場合に、VBScriptは便利です。というのも PerlPHP, Rubyのようにアプリをインストールせずに、メモ帳のみで処理できるからです。

そんなこんなで。AL2の索引も PDFIndexViewerで処理できるようなったので、

PDFIndexViewer.zip

を更新してみました。そんな感じで。