Hatena::ブログ(Diary)

Fioの素敵な日々 このページをアンテナに追加 RSSフィード

2009-06-20

[][]一行目をファイル名にして保存するマクロ

一行目が空行だったら二行目(以下同じ)を対象にします。一行目が長すぎる時は適当に削って、ファイル名にできない文字が含まれている時は変換します。同じファイル名があったら、ファイル名(1).txtのように名前に連番をつけます。
ちょっと前に作ってEmEditorで使っていたのを修正したので、基本的にEmEditorでも動きますが、EmEditorのマクロにはDocument.GetLineというコマンドがあるので、これを使って一行目を取得した方が効率的だと思います。Document.Textで文全体を取得するのは、巨大なファイルの場合は大変ですからねえ(巨大なファイルになる前に通常は保存すると思いますが)。
Meryのマクロを作る際に気をつけなければならないのは、Document.Textでテキスト全体を取得する時はvbCrLf(\r\n)区切りなのですが、Document.Selection.Textで選択範囲を取得するとvbLf(\n)区切りになっていることです*1。JavaScript系の場合は改行と言えば\nが使われる影響と思いますが、将来どちらかに仕様変更されると思いますので、その時に修正が必要です。ちなみに、EmEditorの場合は、どちらもvbCrLf(\r\n)区切りが使われています。(シフト JISでCL+LFの改行指定の場合)

'一行目をファイル名にして保存.vbs
'一行目をファイル名にして保存します
'本文がない場合は、年月日をファイル名にします
'すでに同じファイル名がある場合は、(1)など連番をつけます

'保存するフォルダと拡張子を指定して下さい
Const FolderPath = "C:\home"
Dim ExtName : ExtName = ".txt"

Set FS = CreateObject("Scripting.FileSystemObject")

'フォルダのチェック
If Not FS.FolderExists(FolderPath) then
  MsgBox "指定したフォルダが見つかりません"
  WScript.Quit
End If

'一行目が空行の場合は次の行にします(以下同じ)
For Each line in Split(Document.Text, vbCrLf)
  If line<>"" then
    Title = line
    Exit For
  End If
Next
'本文が何もない場合は、年月日をファイル名にします
If Title="" then Title=Year(Date) & "-" & _
  Right("0" & Month(Date),2) & "-" & Right("0" & Day(Date),2)
'ファイル名に使えない文字を変換します
Title = fixUnFileNameCodes(Title)
'ファイル名が長すぎる場合は、50文字くらいに
Title = Left(Title, 50)

If Not Left(ExtName, 1)="." then ExtName = "." & ExtName
FilePath = FS.BuildPath(FolderPath, Title & ExtName)
FilePath = CheckFilePath(FilePath)
Document.Save FilePath


Private Function fixUnFileNameCodes(inStr)
  '\ / , ; : * ? " < > | はファイル名として使えない
  outStr = Replace(inStr, "\", "¥")
  outStr = Replace(outStr, "/", "/")
  outStr = Replace(outStr, ",", "、")
  outStr = Replace(outStr, ";", ";")
  outStr = Replace(outStr, ":", ":")
  outStr = Replace(outStr, "*", "*")
  outStr = Replace(outStr, "?", "?")
  outStr = Replace(outStr, "<", "<")
  outStr = Replace(outStr, ">", ">")
  outStr = Replace(outStr, "|", "|")
  outStr = Replace(outStr, """", "”")
  outStr = Replace(outStr, vbTab, " ")
  outStr = Replace(outStr, vbCr, "")
  outStr = Replace(outStr, vbLf, "")
  outStr = Replace(outStr, Chr(0), "")
  outStr = Replace(outStr, Chr(11), "")
  fixUnFileNameCodes = outStr
End Function

Private Function CheckFilePath(FilePath)
  '同じ名前のファイルがあったら(1)など連番をつける
  Dim tmpFolderPath, tmpFileName, tmpExtName, tmpFilePath
  If FS.FileExists(FilePath) then
    tmpFolderPath = FS.GetParentFolderName(FilePath)
    tmpFileName = FS.GetBaseName(FilePath)
    tmpExtName = FS.GetextensionName(FilePath)
    If Not Left(tmpExtName, 1)="." then tmpExtName = "." & tmpExtName
    For i = 1 to 1000 '1000以上同じ名前がありそうな時は増やしてね
      tmpFilePath = FS.BuildPath(tmpFolderPath, tmpFileName & "(" & i & ")" & tmpExtName)
      If Not FS.FileExists(tmpFilePath) then Exit For
    Next
  Else
    tmpFilePath = FilePath
  End If
  CheckFilePath = tmpFilePath
End Function

*1:選択範囲を暗号化するマクロをテスト中なのですが、他のエディタで復号すると改行コードが変わってしまっているわけです