我是 Julia 初学者(也是脚本初学者)。
我有一个包含 4 列的文本文件:
1 5.4 9.5 19.5
2 5.4 9.4 20.6
2 6.2 9.6 18.3
1 9.1 0.5 17.2
2 8.5 1.4 19.6
2 8.4 0.6 24.1
etc.
Run Code Online (Sandbox Code Playgroud)
我不知道如何在 Julia 中替换行中的某些值或根据现有的列模式 122 122 添加一个新值。例如,我想添加带有字母 C 和 O 的列(C 当在第一列和 O 时为 2)。我想在带有 C 和 O 的列之后添加新列,其中模式 1 2 2 由数字 4 指定,接下来由数字 5 指定。这就是我想象的结果:
C 4 1 5.4 9.5 19.5
O 4 2 5.4 9.4 20.6
O 4 2 6.2 9.6 18.3
C 5 1 9.1 0.5 17.2
O 5 2 8.5 1.4 19.6
O 5 2 8.4 0.6 24.1
Run Code Online (Sandbox Code Playgroud)
提前谢谢你的帮助。
卡西亚。
Julia 中的字符串处理相当简单。您可以编写一个接受输入和输出文件名的函数,如下所示:
function munge_file(in::AbstractString, out::AbstractString)
# open the output file for writing
open(out, "w") do out_io
# open the input file for reading
open(in, "r") do in_io
# and process the contents
munge_file(in_io, out_io)
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在,内部调用munge_file将不得不执行实际工作(这不是特别优化,但应该非常简单):
function munge_file(input::IO, io::IO = IOBuffer())
# initialize the pattern index
pattern_index = 3
# iterate over each line of the input
for line in eachline(input)
# skip empty lines
isempty(line) && continue
# split the current line into parts
parts = split(line, ' ')
# this line doesn't conform to the specified input pattern
# might be better to throw an error here
length(parts) == 4 || continue
# this line starts a new pattern if the first character is a 1
is_start = parse(Int, parts[1]) == 1
# increment the counter (for the second output column)
pattern_index += is_start
# first column depends on whether a 1 2 2 pattern starts here or not
print(io, is_start ? 'C' : 'O')
print(io, ' ')
# print the pattern counter
print(io, pattern_index)
print(io, ' ')
# print the original line
println(io, line)
end
return io
end
Run Code Online (Sandbox Code Playgroud)
使用 REPL 中的代码产生预期的输出:
shell> cat input.txt
1 5.4 9.5 19.5
2 5.4 9.4 20.6
2 6.2 9.6 18.3
1 9.1 0.5 17.2
2 8.5 1.4 19.6
2 8.4 0.6 24.1
julia> munge_file("input.txt", "output.txt")
IOStream(<file output.txt>)
shell> cat output.txt
C 4 1 5.4 9.5 19.5
O 4 2 5.4 9.4 20.6
O 4 2 6.2 9.6 18.3
C 5 1 9.1 0.5 17.2
O 5 2 8.5 1.4 19.6
O 5 2 8.4 0.6 24.1
Run Code Online (Sandbox Code Playgroud)