在一个界面浏览多个文本文件的工具或方法?

手头有一个数据目录,里面有很多 txt 文件,每个文件不长,大概 10 行以内,现在需要按照创建时间顺序依次浏览这些文件,得到一个类似于时间线的界面(见下图)。虽然可以手动把多个文件合并成一个文件,然后加时间戳分割,但是想看看有没有现有的工具存在。

(图片中软件:Migi

做了个简单的Quicker动作可以试试。

原理比较简单,一共3步,(1)获得选中的文件路径列表。(2)根据创建时间排序并读取内容合并到一个大的文本中。(3)显示这个文本。 主要是2涉及到一点代码。

2 个赞

我又想起了之前的问题

看起来不错!

对你这个需求,可以试试 Logjoint,可以自定义如何解析 log,并且从中提取特定的 field。

可惜的是这个软件对 CJK 的字符支持有问题,非拉丁字符都没法正常显示。已经向作者提了 issue,不过就不知道什么时候能修了。
(更新:和开发者沟通后已经支持)

关于我自己的需求,依然没有找到比较合适的软件。有一个很旧的软件叫做 Kabikaboo,可以建立一个树结构,点击父节点会自动展示所有子节点的内容。不过这个软件 2012 年就停止更新了,现在也没有再更新过。

把多个文件合并成一个虚拟的文件,对应到现实中有两种应用场景,一种是同时查看多个 log,一种是写作的时候每个片段分开写,最后再拼起来。前者有 lnav,后者有 scrivener / latex,可惜对我的需求两种工具都不是很能满足。

更多讨论: software rec - How can I edit multiple text files as one virtual document? - Super User

那既然现有的工具都没有,实在不行可能就得自己上手了。上文 Quicker 提供了一个不错的思路,不过我可能会希望不止能查看,还能直接编辑并应用回原始文件,以及可以提供大纲层级(年/月/日)。一开始想的是直接上 Python 直接拼一个 GUI 出来,后来发现 VS Code 有一个 Virtual Document API,应该用起来更方便一些。然而这几天事情比较多,可能之后会尝试自己手搓一个吧。

一个小 Python 脚本,自动合并目录下的所有 .txt 文件到一个目标文件,顺序为创建时间升序。

from pathlib import Path
from datetime import datetime

MEGRED_FILE_NAME = "merged.md"

def main():
    folder = Path(".")
    text_files = list(folder.glob("*.txt"))
    text_files.sort(key = lambda x: x.stat().st_ctime)
    with open(MEGRED_FILE_NAME, "w", encoding="utf8") as f:
        for t in text_files:
            if t.name == MEGRED_FILE_NAME:
                continue

            print(f"reading {t}")
            create_datetime = datetime.fromtimestamp(t.stat().st_ctime)
            f.write(f"# Filename = {t.name} | Creation = {create_datetime.strftime('%Y-%m-%d %H:%M:%S')} \n")
            with open(t, "r", encoding="utf8") as f2:
                f.writelines(f2.readlines())
            f.write("---EOF---\n")
    print("done")

if __name__ == "__main__":
    main()
1 个赞

写个大样, 还挺好玩的.

private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofDialog = new OpenFileDialog();
            ofDialog.Multiselect = true;
            DialogResult dr=  ofDialog.ShowDialog();
            if(dr==DialogResult.OK)
            {
                //FlowLayoutPanel flowLayoutPanel1 = new FlowLayoutPanel();
                foreach (String file in ofDialog.FileNames)
                {
                    
                    try
                    {
                        RichTextBox tb = new RichTextBox();
                        tb.LoadFile( file,RichTextBoxStreamType.PlainText);

                        tb.Width = flowLayoutPanel1.Width - 100;
                        flowLayoutPanel1.Controls.Add(tb);
                    }
                    
                    catch (Exception ex)
                    {
                        MessageBox.Show(ex.ToString());
                    }
                }

            }

        }

没有排序, 细节你可以自己完善.

另外用ahk实现的话, 其实会更简单一些.

多谢!我原来打算就是用 Python 直接写一个类似于这样的,后来发现似乎虽然能写出来,但是界面感觉太古老了,因此还是考虑用 VS Code API 魔改了

这太厉害了。