EvernoteからObsidianにインポートすると「無題のノート」が多数生成されてしまう件

Evernoteからいくつかのノートブックをenex形式でエクスポートし、Obsidianにインポートした際のトラブル対応記。

Legacyでのエクスポートでは生じないバグ

現行のEvernoteアプリでノートをエクスポートし、Obsidianにインポートしたところ、無数の「無題のノート」が生じてしまった。
以前EvernoteLegacyでのエクスポートしたときにはこんなことはなかったが、現行のEvernoteアプリで起きる現象らしい。

mieki256's diary - EvernoteからObsidianに移行できないか試してみた

ちなみに、Evernote Legacy ではなく、現行版Evernoteでも同じことをしたのだけど、現行版でエクスポートした .enex を他の変換ツールに渡すと、 「無題のノート」なるファイルが500ファイル以上出来上がってしまってよろしくなかった。何故かは分からないけど、自分の環境の場合は、Legacy 版でエクスポートしたほうが良さそうだなと…。

自分の環境でも2000から3000個程度の「無題のノート.2348.md」みたいなノートができてしまった。

対策1:手作業での修正、法則性の発見

自分の場合はノート冒頭1行目にノートタイトルを書くようにしていた。
不幸中の幸い、それを拾うことができたので、それっぽい部分を探してコピペすることで手作業によるノートタイトルの復旧は可能そうであった。
いくつかのノートを確認するうち、それっぽい部分の法則性として「# 無題のノート」の2行下の文言を拾えば良さそう、ということもわかってきた。

ノートの数が少なければ、手作業で押し切るのも一案と思う。
自分の場合は途中まで手作業で進めてみたものの数が多かったので、生成AIによるスクリプトを試してみることにした。

対策2:生成AIとの対話からスクリプト生成

Copilotとの対話を経て、下記PowerShellスクリプトにたどり着いた。
(フォルダを指定する部分は各自の環境に置き換えを。動作保証はできません。実行前にバックアップを取るなどした上で、自己責任でご利用ください。)

  
Add-Type -AssemblyName System.Windows.Forms

# フォルダ内のテキストファイルを取得
$files = Get-ChildItem -Path "C:\path\to\your\folder" -Filter 無題のノート*.md

foreach ($file in $files) {
    Write-Host "Processing file: $($file.FullName)"

    # ファイルを読み込む(UTF-8を指定)
    $content = Get-Content -Path $file.FullName -Encoding "UTF8"

    # デバッグメッセージ
    Write-Host "File content loaded."

    # デバッグメッセージで$contentの中身を表示
    Write-Host "File content:"
    $content | ForEach-Object { Write-Host $_ }

    # 「# 無題のノート」を検索(#をエスケープ)
    $pattern = [regex]::Escape("# 無題のノート")
    $match = $content | Select-String -Pattern $pattern

    if ($match) {
        Write-Host "'# 無題のノート' found in file: $($file.FullName)"

        # 2行下のテキストを取得
        $lineIndex = $match.LineNumber + 2
        $newFileName = $content[$lineIndex - 1]

        # 新しいファイル名を作成
        $newFilePath = Join-Path -Path $file.DirectoryName -ChildPath "$newFileName.md"

        # ファイル名が重複する場合に連番を付ける
        $counter = 1
        while (Test-Path -Path $newFilePath) {
            $newFilePath = Join-Path -Path $file.DirectoryName -ChildPath "$newFileName.$counter.md"
            $counter++
        }

        # ダイアログを表示して確認
        $result = [System.Windows.Forms.MessageBox]::Show("ファイル名を変更しますか?`n`n元のファイル名: $($file.FullName)`n新しいファイル名: $newFilePath", "確認", [System.Windows.Forms.MessageBoxButtons]::OKCancel)

        if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
            Write-Host "Renaming file: $($file.FullName) to $newFilePath"
            # ファイル名を変更
            Rename-Item -Path $file.FullName -NewName $newFilePath
        }
    } else {
        Write-Host "'# 無題のノート' not found in file: $($file.FullName)"
    }
}
  

ざっとこういうことを処理しているはず。

  • 特定のフォルダ内から「無題のノート*.md」を探す
  • 中身を読み込んで「# 無題のノート」の2行下の文字列を取得
  • ファイル名のBefore Afterを表示する確認ダイアログを出す
  • 「OK」ボタンで実行(ファイル名がAfterに変更される)

ちなみに当初はうまく動かなくて、Copilotとの対話によりデバッグ対応した。
大きな山としては、対象ノートは抽出できるが「無題のノート*.md」を探すステップがうまく機能しないトラブルがあった。
対話によるデバッグによりノートの内容を表示させてみて、文字コードが一致していないから「# 無題のノート」という文字列が見つからない状態だったことが判明した。
そのことを指摘して対応を問うたところ、ついに動くものが出来上がった。

編集後記

ここ数週間のEvernoteのサービス改訂やアップデートにまつわる不具合から、Evernoteの将来に不安を感じるところがある。
応援したい気持ちはあれども、世の人のEvernoteへの怨嗟の声を見ると、サービスの死期は早まったのではないかと感じている。
いきなりサービス終わってしまったらとても困るので、無くなって困るデータはもうEvernoteには置くべきではないなのかも。
多くのWebサービスと連携していて便利に使っていたし、課金ユーザーとして長年利用してきたし、自分にとってはかけがえのないサービスだったのだけれども。

コメント

タイトルとURLをコピーしました