在Julia语言中如何将内容写入文件?

4

以下是关于我的文件的概述:

[2020/06/18 17:19:25] Window closed --> OptionDialog = 'Waiting Dialog - Session restore'  -->  frame = 'DataManager' 
[2020/06/18 17:19:40] Window opened -->  frame = 'DataManager' 
[2020/06/18 17:19:40] MB1  --> Menu item = [Toolbox]  -->  frame = 'DataManager' 
[2020/06/18 17:19:42] MB1  --> Menu item = [2G&R Synthesis toolbox, Toolbox]  --> Popup Menu -->  frame = 'DataManager' 
[2020/06/18 17:19:42] Window opened -->  frame = 'ToolBox' 
[2020/06/18 17:19:42] Window gained focus -->  frame = 'ToolBox' 

我希望能够仅检索包含日期后紧接着子字符串“Window”的行,并将其写入新的文本文件中。以下是我目前完成的内容:

file = open("Test2.txt") do file
    f = readlines(file)
    for line in f
      if line[23:28]== "Window"
         open("t.txt","w") do file
         write(file,line)
         end
      end
   end
end


我的问题是,只有第一个文件中包含“Window”的最后一行被写入新文件中。 例如在这里,它将是:
[2020/06/18 17:19:42] Window gained focus -->  frame = 'ToolBox'

我如何确保将所有包含“Window”文本的行都写入新文件中?谢谢您提前的回答,Valentine。

1
看一下函数 eachline,它可以减少你需要编写的代码行数。 - Fredrik Bagge
我刚写了这个 :). 同意 - 这是一种首选的方法,因为它不必将整个文件读入内存。 - Bogumił Kamiński
1个回答

5

首先,我认为您应该将 write(file, line) 替换为 println(file, line),否则不会打印换行符。

有几种解决方案可以解决您的问题:

最简单的方法是在 open("t.txt", "w") 中将 "w" 更改为 "a"; 它的问题是如果文件存在,则新行将被附加到它上面。

通常,您只需打开一次文件进行写入并使用类似以下内容的内容:

open("Test2.txt") do file
    f = readlines(file)
    open("t.txt", "w") do file2
        for line in f
            if line[23:28] == "Window"
                println(file2, line)
            end
        end
    end
end

最后,你不需要使用readlines,因为它会占用大量内存来处理大文件,相反你可以像这样逐行处理文件:

open("t.txt","w") do file2
    for line in eachline("Test2.txt")
        if line[23:28] == "Window"
            println(file2, line)
        end
    end
end

还要注意,只有在您知道文件中只有ASCII字符并且确信行的长度足够长达到28个字符时,检查line[23:28] == "Window"才是正确的(否则如果没有这么多的字符,代码将抛出错误)。如果您不确定是否符合这种情况,则最好使用:

startswith(chop(s, head=22, tail=0), "Window")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接