為知筆記是一款不錯的筆記軟件,從 2013 年用到現(xiàn)在,整整用了十個年頭。令人難以置信的是,這軟件整整十年居然都沒有漲價,60 元/年的價格,真真是良心價。
從為知筆記遷移,主要基于以下的原因(用其他筆記的道友也可以考慮):
數(shù)據(jù)安全。為知筆記雖然支持本地部署,也支持將數(shù)據(jù)導(dǎo)出到本地,但本地部署過于復(fù)雜,默認(rèn)情況下數(shù)據(jù)文件是保存在網(wǎng)絡(luò)服務(wù)器中的。 不知道軟件還能活多久。我一直使用的是老版的為知筆記,因?yàn)槠渲С掷猛獠?markdown 編輯器進(jìn)行文件編輯,也支持導(dǎo)出 markdown 文件。廠家后面搞了個重構(gòu)版,但不支持外部編輯器,也不能導(dǎo)出 markdown 文件。重構(gòu)版和當(dāng)前滿大街的筆記軟件并無區(qū)別??珊薜氖枪俜剿坪鯇习娴闹С至Χ确浅H酰荒暌搽y得更新一次,我很擔(dān)心官方會在某一天直接宣布關(guān)閉老版本。 軟件比較老,屬于第一代筆記軟件,不支持新一代筆記軟件的各種特性(如雙鏈、知識圖譜等),后續(xù)版本也不可能支持這些特性。 純粹是用膩了。用了這么多年,各種文檔充斥其中缺少整理,臟亂差看著就糟心。 終于在前不久的某天,我實(shí)在是無法忍耐了。
整理文檔看起來簡單,無非就是將原來的文檔從為知筆記導(dǎo)出,再將文檔導(dǎo)入到 Obsidian 中。這里 Obsidian 并不需要導(dǎo)入,只需要將文件拷貝到 Obsidian 的文件夾中即可。所以問題給到了如何導(dǎo)出為知筆記文檔上。
為知筆記提供了手工逐篇導(dǎo)出 markdown 的功能,并不支持批量導(dǎo)出大量文檔。而且對于從未打開過的文檔,還得使用鼠標(biāo)點(diǎn)過讓其下載到本地才能導(dǎo)出。
幾千篇文檔一個個的導(dǎo)出,這簡直就不是人力所能為的事情。不過天無絕人之路之路,當(dāng)將文檔打開時,為知筆記會從服務(wù)器中將對應(yīng)的文件下載到本地,只不過文件格式不是 markdown,而是一個擴(kuò)展名為 ziw 的壓縮文件,解壓出來是一個 html 文件,只需要將 html 中的內(nèi)容提取出來就可以了。
所以后面的問題就是如何批量提取壓縮包中的文件。這顯然可以很容易地通過程序來實(shí)現(xiàn)。下面是用 c#
實(shí)現(xiàn)的核心代碼(從歷史文件中翻出來的,2014 年寫的)。
/// <summary> /// 解壓文件到當(dāng)前路徑下/// </summary> /// <param name="zipFileName"> ziw文件名</param> private void UnZiwFile (string zipFileName ) { string path = GetPathInfo(zipFileName)[0 ]; //文件上級目錄 string fileName = GetPathInfo(zipFileName)[1 ]; //解壓ziw文件,得到index.html文件,解壓后放在當(dāng)前路徑下 (new FastZip()).ExtractZip(zipFileName, path, "" ); //修改index.html文件名稱 string path_newfolder = path + "\\temp" ; //定義一個新的路徑 if (!Directory.Exists(path_newfolder)) { Directory.CreateDirectory(path_newfolder); } string path_htmlfile = path + "\\index.html" ; if (File.Exists(path_htmlfile)) { FileInfo fi = new FileInfo(path + "\\index.html" ); fi.MoveTo(path_newfolder + "\\" + fileName + ".html" ); fi.MoveTo(path + "\\" + fileName + ".html" ); Directory.Delete(path_newfolder); } }/// <summary> /// 將wiz文件轉(zhuǎn)化為md文件,放置在原位置/// </summary> /// <param name="filePath"> html文件完整路徑</param> private void File_Html2MD (string htmlFilePath ) { string path = GetPathInfo(htmlFilePath)[0 ]; //文件上級目錄 string fileName = GetPathInfo(htmlFilePath)[1 ]; //沒有擴(kuò)展名的文件名 //讀取index.html文件,獲取title及MD中的內(nèi)容 StringBuilder sb = new StringBuilder(); string str = File.ReadAllText(htmlFilePath); //利用正則表達(dá)式匹配文檔內(nèi)容 string divs = "<div>.+?</div>" ; MatchCollection ms = Regex.Matches(str, divs); foreach (Match m in ms) { sb.AppendLine(m.Groups[0 ].Value.ToString()); } sb.Replace("<div> </div>" , "" ); sb.Replace("<div>" , "" ); sb.Replace("</div>" , "" ); sb.Replace(">" , "> " ); sb.Replace("<br>" , "\n" ); sb.Replace("</br>" , "\n" ); sb.Replace("&" , "&" ); sb.Replace("<" , "<" ); //將正文存入md文件,因?yàn)閠itle中自帶.md,所以干脆當(dāng)做擴(kuò)展名處理了 File.WriteAllText(path + "\\" + fileName + ".md" , sb.ToString()); }
只需要幾秒鐘,幾千篇文檔瞬間轉(zhuǎn)化成了 markdown 文件。
不過過程還是過于麻煩,有空了整一個自動從為知網(wǎng)站上下載文檔,然后自動轉(zhuǎn)換的代碼。
文件轉(zhuǎn)完了,下一步是考慮文件轉(zhuǎn)移的事情。目前的方案是轉(zhuǎn)移到Obsidian及我來筆記。其中我來筆記用于網(wǎng)絡(luò)同步,Obsidian用于備份。
我來筆記支持批量導(dǎo)入和導(dǎo)出markdown文件,可以快速將從為知筆記轉(zhuǎn)化的大量文檔迅速轉(zhuǎn)移到筆記中。Obsidian則更簡單,直接將文件復(fù)制到相應(yīng)的硬盤目錄中即可。
目前已完成了一部分重要文檔的整理工作。
(完)