使用 Julia 语言处理文件

kat*_*248 1 file julia

我是 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)

提前谢谢你的帮助。

卡西亚。

pfi*_*seb 5

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)