gpt4 book ai didi

读取模板文件并在一些修改后将其写入磁盘

转载 作者:行者123 更新时间:2023-12-03 23:51:42 24 4
gpt4 key购买 nike

我需要读取模板文件 test.txt ,修改内容,然后将修改后的副本写入磁盘,名称为 foo`i`.in ( i 是迭代数)。由于我需要多次执行此操作(一百万次并不少见),因此首选有效的解决方案。模板文件是这样的:

1 
bar.out
70.000000000000000
2.000000000000000
14.850000000000000
8000.000000000000000
120.000000000000000
60.000000000000000
0.197500000000000
0.197500000000000
2.310000000000000
0.200000000000000
0.000000000000000
1.000000000000000
0.001187700000000
22.000000000000000
1.400000000000000
1.000000000000000
0.010000000000000
100
0.058600000000000
-0.217000000000000
0.078500000000000
-0.110100000000000
30
500.000000000000000
T

我不需要修改所有行,只需要修改其中的一些行。具体我需要修改 bar.outbar`i`.out哪里 i是迭代索引。我还需要使用以下值修改一些数字行:
parameters <- data.frame(index = c(1:10, 13:16, 21:22), variable = c("P1", 
"P2", "T1", "s", "D", "L", "C1", "C2", "VA",
"pw", "m", "mw", "Cp", "Z", "ff_N", "ff_M"),
value = c(65, 4, 16.85, 7900, 110, 60, 0.1975, .1875, 2.31,
0.2, 0.0011877, 22.0, 1.4, 1.0, 0.0785, -0.1101))

所有其他行必须保持不变,包括最后一行 T .因此,假设我处于第一次迭代, 预期输出 是一个名为 foo1.in 的文本文件具有内容(确切的数字格式并不重要,只要 parameters$value 中的所有有效数字都包含在 foo1.in 中):
1 
bar1.out
65.000000000000000
4.000000000000000
16.850000000000000
7900.000000000000000
110.000000000000000
60.000000000000000
0.197500000000000
0.187500000000000
2.310000000000000
0.200000000000000
0.000000000000000
1.000000000000000
0.001187700000000
22.000000000000000
1.400000000000000
1.000000000000000
0.010000000000000
100
0.058600000000000
-0.217000000000000
0.078500000000000
-0.110100000000000
30
500.000000000000000
T

修改 foo.inbar.out很简单:
template  <- "test.txt"
infile <- "foo.in"
string1 <- "bar.out"
iteration <- 1

# build string1
elements <- strsplit(string1, "\\.")[[1]]
elements[1] <- paste0(elements[1], iteration)
string1 <- paste(elements, collapse = ".")

# build infile name
elements <- strsplit(infile, "\\.")[[1]]
elements[1] <- paste0(elements[1], iteration)
infile<- paste(elements, collapse = ".")

现在,我想阅读模板文件并只修改预期的行。我面临的第一个问题是 read.table只输出一个数据帧。由于我的模板文件在同一列中包含数字和字符串,如果我用 read.table 读取所有文件我会获得一个字符列(我猜)。我通过只读取我感兴趣的数值来规避这个问题:
    # read template file   
temp <- read.table(template, stringsAsFactors = FALSE, skip = 2, nrows = 23)$V1
lines_to_read <- temp[length(temp)]

# modify numerical parameter values
temp[parameters$index] <- parameters$value

不过现在不知道怎么写 foo1.in .如果我使用 write.table ,我只能将矩阵或数据帧写入磁盘,因此我无法在同一列中写入包含数字和字符串的文件。我该如何解决这个问题?

编辑我提供了一些关于这个问题的背景知识,以解释为什么我需要多次编写这个文件。因此,我们的想法是对计算机代码(可执行文件)的校准参数执行贝叶斯推理。基本思想很简单:您有一个黑盒(商业)计算机代码,它模拟物理问题,例如 FEM 代码。让我们将此代码称为 Joe。给定一个输入文件,Joe 输出对物理系统响应的预测。现在,我还对该系统的响应进行了实际的实验测量。我想找到 Joe 的输入值,以使 Joe 的输出与实际测量值之间的差异最小化(实际上情况完全不同,但这只是提供一个想法)。在实践中,这意味着我需要用不同的输入文件多次运行 Joe,并迭代地找到减少 Joe 预测和实验结果之间“差异”的输入值。简而言之:
  • 我需要生成许多输入(文本)文件
  • 我事先不知道输入文件的内容。在优化过程中以迭代方式修改数值参数。
  • 我还需要为每个输入读取 Joe 的输出。这实际上是另一个问题,我可能会在这一点上写一个具体的问题。

  • 因此,虽然 Joe 是一个商业代码,我只有可执行文件(没有源代码),但贝叶斯推理是在 R 中执行的,因为 R(以及重要的 Python)有出色的工具来执行此类研究。

    最佳答案

    这可能是使用模板语言最容易解决的,例如 Mustache ,它在 whisker 中的 R 中实现包裹。

    下面是一个示例,说明如何在您的情况下完成此操作。例如,我只实现了前三个变量和 bar1.out .实现其余变量应该很简单。

    library(whisker)


    # You could also read the template in using readLines
    # template <- readLines("template.txt")
    # but to keep example selfsufficient, I included it in the code
    template <- "1
    bar{{run}}.out
    {{P1}}
    {{P2}}
    {{T1}}
    8000.000000000000000
    120.000000000000000
    60.000000000000000
    0.197500000000000
    0.197500000000000
    2.310000000000000
    0.200000000000000
    0.000000000000000
    1.000000000000000
    0.001187700000000
    22.000000000000000
    1.400000000000000
    1.000000000000000
    0.010000000000000
    100
    0.058600000000000
    -0.217000000000000
    0.078500000000000
    -0.110100000000000
    30
    500.000000000000000
    T"


    # Store parameters in a list
    parameters <- list(
    run = 1,
    P1 = 65,
    P2 = 4,
    T1 = 16.85)

    for (i in seq_len(10)) {
    # New set of parameters
    parameters$run <- i
    parameters$P1 <- sample(1:100, 1)

    # Generate new script by rendering the template using paramers
    current_script <- whisker.render(template, parameters)
    writeLines(current_script, paste0("foo", i, ".in"))

    # Run script
    # system(...)
    }

    mustache 的作用(在这种情况下;更复杂的模板是可能的;例如条件元素)是替换所有 {{<variable>}}parameters 中的相应值列表。

    关于读取模板文件并在一些修改后将其写入磁盘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42373726/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com