Engee 文档
Notebook

字符串汇编

本例探讨了使用字符串指定操作和变量的其他方法。我们将详细介绍 parseMeta.parseeval 函数,并演示其实际应用。

在工作过程中,我们将解析两个不同格式的文件:*这将清楚地显示这些工具在数据处理和动态代码执行方面的可能性。

Julia 中的解析函数用于将数据的字符串表示转换为相应的数字或其他基本类型。在处理以字符串表示的数据时,如果需要将其转换为数字、字符或其他类型的值,该函数尤其有用。

例如,如果你有一个包含数字(如 "5")的字符串。可以使用 parse 将其转换为整数。同样,浮点字符串 "1.23 "也可以转换为浮点数。该函数支持指定转换的类型。

使用示例

In [ ]:
Pkg.add(["CSV"])
In [ ]:
num1 = parse(Int, "5")   
num2 = parse(Float64, "1.23")  
print("Результаты: $([num1, num2])")
Результаты: [5.0, 1.23]

Julia 中的 Meta.parse 函数用于将包含表达式或函数调用的字符串转换为 Expr(Julia 表达式)类型的对象。它是一个强大的元编程工具,允许你以抽象语法树(AST)的形式分析和修改程序代码。

如果字符串中包含表达式,如数学运算或函数调用,Meta.parse 会将其转换为结构化的表示形式,用于分析或执行。

与 parse 的重要区别在于 1.1. parse只将字符串转换为给定类型的最终值,如数字、逻辑值或字符。它不支持复杂表达式或函数调用。 2.2. Meta.parse只处理以字符串表示的代码,并将其转换为可解析或传递执行的 Expr 对象。 使用示例

In [ ]:
cmd = Meta.parse.("1+1")
Out[0]:
:(1 + 1)

Julia 中的 eval 函数用于执行以 Expr(抽象语法树)类型对象或其他有效表达式表示的表达式。它允许动态运行代码,是执行元编程任务的强大工具,但由于存在执行不需要的代码的潜在风险,因此应谨慎使用。

基本操作原理 eval 会获取表达式,对其进行分析并在全局范围内执行。这意味着表达式中使用的所有变量和函数都必须在全局范围内定义。

使用示例

In [ ]:
eval(cmd)
Out[0]:
2

接下来,让我们以 CSV 文件为例进行说明。为此,让我们加载其他库。

In [ ]:
Pkg.add("CSV")
using DataFrames, CSV
   Resolving package versions...
  No Changes to `~/.project/Project.toml`
  No Changes to `~/.project/Manifest.toml`

读取 CSV

In [ ]:
DataFrameCSV = CSV.read("$(@__DIR__)/$("data.csv")", DataFrame)
Out[0]:
9×1 DataFrame
RowTime_and_Ampl
String31
1-1.08,-96.6667
2-1.0799,-126.667
3-1.0798,-143.333
4-1.0797,-166.667
5-1.0796,-176.667
6-1.0795,-166.667
7-1.0794,-146.667
8-1.0793,-126.667
9-1.0792,-96.6667

从生成的 DataFrame 中选择包含数据的列。

In [ ]:
Data = DataFrameCSV.Time_and_Ampl
Out[0]:
9-element Vector{String31}:
 "-1.08,-96.6667"
 "-1.0799,-126.667"
 "-1.0798,-143.333"
 "-1.0797,-166.667"
 "-1.0796,-176.667"
 "-1.0795,-166.667"
 "-1.0794,-146.667"
 "-1.0793,-126.667"
 "-1.0792,-96.6667"

如你所见,我们有了一个行向量。现在,让我们给每一行添加方括号,以获得一组向向量添加元素和执行这些操作的命令。

In [ ]:
DataVec = eval.(Meta.parse.("[".*Data.*"]"))
Out[0]:
9-element Vector{Vector{Float64}}:
 [-1.08, -96.6667]
 [-1.0799, -126.667]
 [-1.0798, -143.333]
 [-1.0797, -166.667]
 [-1.0796, -176.667]
 [-1.0795, -166.667]
 [-1.0794, -146.667]
 [-1.0793, -126.667]
 [-1.0792, -96.6667]

如你所见,结果是一个由 2 个元素组成的向量集,每一行都单独执行。

下一个例子是执行 TXT 文件。

In [ ]:
txt = open(io->read(io, String), "$(@__DIR__)/data.txt") # Читаем TXT
Out[0]:
"1.0\n15.726465174717665\n118.19779715124804\n564.5945977782826\n1922.5628210505968\n4961.486649014338\n10069.27911225147\n16457.781390988064\n22003.338138220104\n24301.413576125095\n22293.787678765948\n17018.378514886626\n10791.5437594143\n5653.533013094259\n2423.11034196715\n836.6005210914026\n227.22904721973316\n46.794190857389\n6.873719057490497\n0.6421978090261691\n0.028701721170992484"

正如你所看到的,我们得到了一个包含数字的字符串,并在每个值之后在文本文档中换行。接下来,我们用逗号替换 \n 并用[]将字符串包起来。

In [ ]:
data_str = "[" * replace(txt, "\n" => ",") * "]"
Out[0]:
"[1.0,15.726465174717665,118.19779715124804,564.5945977782826,1922.5628210505968,4961.486649014338,10069.27911225147,16457.781390988064,22003.338138220104,24301.413576125095,22293.787678765948,17018.378514886626,10791.5437594143,5653.533013094259,2423.11034196715,836.6005210914026,227.22904721973316,46.794190857389,6.873719057490497,0.6421978090261691,0.028701721170992484]"

现在,字符串就是一个简单的向量赋值。将字符串转换为表达式并执行表达式即可得到向量。

In [ ]:
data_vector = eval(Meta.parse(data_str))
Out[0]:
21-element Vector{Float64}:
     1.0
    15.726465174717665
   118.19779715124804
   564.5945977782826
  1922.5628210505968
  4961.486649014338
 10069.27911225147
 16457.781390988064
 22003.338138220104
 24301.413576125095
 22293.787678765948
 17018.378514886626
 10791.5437594143
  5653.533013094259
  2423.11034196715
   836.6005210914026
   227.22904721973316
    46.794190857389
     6.873719057490497
     0.6421978090261691
     0.028701721170992484

这样,我们就得到了一个包含 21 个值的向量,我们可以像普通向量一样与它进一步交互,例如,将其元素舍入为整数。

In [ ]:
plot(eval(Meta.parse("round.(data_vector)")))
Out[0]:

输出

在本例中,我们学习了三个关键的 Julia 函数:parseMeta.parseeval,它们可以让你高效地处理以字符串表示的数据和代码。

这三个函数为处理数据和动态代码提供了一套强大的工具,对于文本处理、自动化和敏捷解决方案尤为重要。我们对不同文件的实验表明,这些工具能有效解决不同类型输入数据的问题。