Engee 文档
Notebook

字符串的汇编

此示例讨论使用字符串定义操作和变量的替代方法。 我们将详细了解parse,元。parseeval函数,以及演示它们的实际应用。

在工作过程中,将解析两个不同格式的文件:CSVTXT,这将清楚地显示这些工具用于数据处理和动态代码执行的能力。

Julia中的parse函数用于将数据的字符串表示形式转换为相应的numeric或其他基本类型。 当您需要处理表示为需要转换的字符串的数据时,它特别有用,例如,转换为数字、字符或其他类型的值。

例如,如果您有一个包含数字(如"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中的parse函数用于将包含表达式或函数调用的字符串转换为Expr(Julia表达式)类型的对象。 它是一个功能强大的元编程工具,允许您以抽象语法树(AST)的形式分析和修改程序代码。

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

与parse的重要区别:

  1. parse仅将字符串转换为给定类型的有限值,例如数字、布尔值或符号。 它不支持复杂的表达式或函数调用。
  2. 元。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,这使我们能够有效地处理以字符串表示的数据和代码。

这三个功能共同提供了一组强大的工具,用于处理数据和动态代码,这在文字处理,自动化和创建灵活解决方案的任务中尤为重要。 我们对不同文件的实验显示了这些工具解决不同类型输入数据问题的有效性。