【问题标题】:Parsing a text file in Julia在 Julia 中解析文本文件
【发布时间】:2016-06-24 11:36:28
【问题描述】:

我是 Julia 的新手。我正在寻找一种将 50 个文本文件中的值输入数组的方法。这些文件以data-X.dat 的形式命名,其中X 是1-50 的整数。文件格式如下(我无法控制格式):

garbage text
comment: words = I1, more words = I2
more garbage text
blah blah   = F1
measurement = F2   F3 text

其中I1I2 是整数,F1F2F3 是十进制形式的数字(例如12.345)。我想将数据转储到数组中,例如,数组i1 的第三个元素是文件data-3.datI1 的值。

我将如何在 Julia 中执行此操作?到目前为止,我发现的所有示例都处理由简单分隔符解析的数据文件,这里不是这种情况。

【问题讨论】:

  • 我认为您的 Fortran 示例是不必要的。
  • 文本文件的大小是否足够小,您可以将整个内容读入内存并通过在每行开头搜索适当的字符串来解析它?
  • @ColinTBowers 是的,每个文件的大小约为 1 KB,因此应该可行。这是我在 Julia 的第一个项目,所以如果你能提供一些框架代码来解释“搜索合适的字符串”的语法,那将非常感激。
  • 使用fid1 = open("filePath") ; x = readlines(fid1) ; close(fid1)读取文件。当循环遍历这些行时,看起来您可以使用contains(line, '=') 来找到合适的行,然后明智地使用split 应该可以让您到达那里。无论如何都没有效率,但它会完成工作。 ps 正则表达式可能是解决这个问题的“正确”方法,但我确实知道它们的初始学习曲线是陡峭的。我倾向于自己避免使用它们,即使我知道我应该使用它们:-)

标签: arrays io julia


【解决方案1】:

我认为流上的 eachline 迭代器加上 regular expressions 是您正在寻找的。​​p>

【讨论】:

  • 总是有wiki
  • 正则表达式看起来很有希望,但语法远远超出了我的理解水平,并且使用它,我似乎一次只能提取一个数字。你能不能给我看一个简单的例子,比如字符串x = "drag = 1.2345 Newtons"?如何将 1.2345 存储到某个变量中,但不知道小数点前后有多少位?
【解决方案2】:

感谢@ColinTBowers 和@AaronSheldon 的帮助。这是我第一次使用正则表达式,我大量使用了它们上的Wikipedia 页面。如果将来有人在寻找示例代码,我最终会这样做:

nf = 50                       # number of files
nmbr = r"\-?[0-9]+\.?[0-9]*"  # regex to find an integer or decimal number

i1 = zeros(Int64, nf)
i2 = zeros(i1)
f1 = zeros(Float64, nf)
f2 = zeros(f1)
f3 = zeros(f1)

for X in 1:nf
   file = open("data-$(X).dat")
   line = readlines(file)
   extract(linenum, index=1) = matchall(nmbr, line[linenum])[index]
   i1[X] = parse(Int64, extract(2,1))
   i2[X] = parse(Int64, extract(2,2))
   f1[X] = parse(Float64, extract(4))
   f2[X] = parse(Float64, extract(5,1))
   f3[X] = parse(Float64, extract(5,2))
   close(file)
end

【讨论】:

    猜你喜欢
    • 2021-08-14
    • 2014-09-20
    • 2015-07-12
    • 2014-05-28
    • 2012-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多