手头有一个数据目录,里面有很多 txt 文件,每个文件不长,大概 10 行以内,现在需要按照创建时间顺序依次浏览这些文件,得到一个类似于时间线的界面(见下图)。虽然可以手动把多个文件合并成一个文件,然后加时间戳分割,但是想看看有没有现有的工具存在。
(图片中软件:Migi)
手头有一个数据目录,里面有很多 txt 文件,每个文件不长,大概 10 行以内,现在需要按照创建时间顺序依次浏览这些文件,得到一个类似于时间线的界面(见下图)。虽然可以手动把多个文件合并成一个文件,然后加时间戳分割,但是想看看有没有现有的工具存在。
(图片中软件:Migi)
做了个简单的Quicker动作可以试试。
原理比较简单,一共3步,(1)获得选中的文件路径列表。(2)根据创建时间排序并读取内容合并到一个大的文本中。(3)显示这个文本。 主要是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()
写个大样, 还挺好玩的.
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 魔改了
这太厉害了。