通过实例学习Virtools脚本语言VSL - 解析字符串

简介: 该习题演示解析字符串及用字符串中包含的信息填充数组(Array)。 开始一个新的作品并创建一个数组(Array)。把数组重命名为 "Players" (没有引号) 并添加三个列(column),如下命名 - 列类型:NickNames - String Age - Integer Score - Integer. 在Level下创建新脚本,并添加一个Run VSL BB。

该习题演示解析字符串及用字符串中包含的信息填充数组(Array)。

  1. 开始一个新的作品并创建一个数组(Array)。把数组重命名为 "Players" (没有引号) 并添加三个列(column),如下命名 - 列类型:
    • NickNames - String
    • Age - Integer
    • Score - Integer.
  2. 在Level下创建新脚本,并添加一个Run VSL BB。在VSL Script Manager中添加两个pIn。第一个pIn重命名为"data",类型设为String。第二个pIn重命名为"array",类型设为Array。
  3. 切换到 Schematic工作区,输入以下字符(不包括引号),作为“data”pIn的值:

    "Eva,22,1024.
    Jane,34, 544.
    Pierre, 17, 5410.
    John, 85,10."

    你可能想要展开'data' pIn中的数据输入的字段。

    构想是解析输入的字符串,提取出其中的信息,然后复制到数组中。该习题中,所需要的信息是名字、年龄和积分。逗号和句号作为数据是引不起人们兴趣的,但作为隔离数据字段或标志行结束点的字符是非常有用的。你会用到VSL <- SDK 对应表 - 类与方法 中列出了的StringTokenizer类。给定要解析的字符串及用到的分隔符,"NextToken(str iPrevToken)" 这个方法就会一个个的提取出令牌。

    【译注:网络资源 - bruce - 在邱仲潘译的《Mastering Java 2》有这么一段

     StreamTokenizer类根据用户定义的规则,从输入流中提取可识别的子串和标记符号,这个过程称为令牌化 (tokenizing ),因为流简化为了令牌符号。令牌 (token )通常代表关键字、变量名、字符串、直接量 和大括号等语法标点。

    我们参考邱仲潘的这段译文,统一为
    token:令牌
    tokenizing:令牌化
    tokenizer:令牌解析器

    cherami提到的翻译为“标记”,也可以理解,但token更准确的指一个字串(或流)中的以空格、','等(用户指定的规则)分割开来的一个一个的子串,使用“标记”好像范围比较窄。借用令牌网中的这个术语--“令牌”,我觉得很形象。

  4. 在代码窗口中输入下面的代码:
    void main()
    {
    // We clear all data in the array
    array.Clear();

    // We create the first tokenizer in order to
    // get data line by line. The "." separates lines.

    str tokenLine = null;
    StringTokenizer tokenizerLine(data.CStr(), ".");

    int row = 0;

    // Get new line
    while (tokenLine = tokenizerLine.NextToken(tokenLine))
    {
    // For each line extracted, we add a row in the array
    array.AddRow();

    // The second tokenizer works with the extracted line
    // to extract the data on a word by word basis.
    // The "," separates words.

    str tokenWord = null;
    StringTokenizer tokenizerWord(tokenLine, ",");

    int column = 0;

    // Get new word
    while (tokenWord = tokenizerWord.NextToken(tokenWord))
    {
    // Insert word in the array
    array.SetElementStringValue(row, column, tokenWord);
    ++column;
    }
    ++row;
    }
    }
  5. 编译VSL脚本并运行。要确认那个数组中的内容如下:




    你可以看到,"Jane", "Pierre" 和 "John"这几个名字提取得不是很好,它们都以一个换行符开始(非打印换行符以一个小盒子的样子显示)。为了移除这个额外的字符,你需要给VSL脚本添加一个移除换行符的函数。下面的代码应该能完成这个任务:
    void 		RemoveFirstReturnCharacter(String str2clear)
    {
    // If first character is equal to return...
    if (str2clear[0] == '/n')
    / ... crop string from second character to the end
    str2clear = str2clear.Crop(1, str2clear.Length()-1);
    }
  6. 修改你的代码,要包括上面的函数。你的代码现在应该是像这个样子:
    void main()
    {
    // We clear all data in the array
    array.Clear();

    // We create the first tokenizer in order to
    // get data line by line

    str tokenLine = null;
    StringTokenizer tokenizerLine(data.CStr(), ".");

    int row = 0;

    // Get new line
    while (tokenLine = tokenizerLine.NextToken(tokenLine))
    {
    // For each line extracted, we add a row in the array
    array.AddRow();

    // The second tokenizer works with the extracted line
    // to extract the data on a word by word basis.
    // The "," separates words.

    str tokenWord = null;
    StringTokenizer tokenizerWord(tokenLine, ",");

    int column = 0;

    // Get new word
    while (tokenWord = tokenizerWord.NextToken(tokenWord))
    {
    // Remove first character if it's a '/n'
    String strToClear = tokenWord;
    RemoveFirstReturnCharacter(strToClear);

    // Insert word in the array
    array.SetElementStringValue(row, column, strToClear.CStr());
    ++column;
    }
    ++row;
    }
    }
    现在,在把单词插入数组之前,新的函数检查字符串并对之修改(如果有必要) - 移除换行符。
  7. 编译你的VSL脚本并运行。你的数组现在是不是看起来好多了?


目录
相关文章
|
11月前
|
存储 缓存 负载均衡
阿里云服务器实例选择指南:热门实例性能、适用场景解析对比参考
2025年,在阿里云的活动中,主售的云服务器实例规格除了轻量应用服务器之外,还有经济型e、通用算力型u1、计算型c8i、通用型g8i、计算型c7、计算型c8y、通用型g7、通用型g8y、内存型r7、内存型r8y等,以满足不同用户的需求。然而,面对众多实例规格,用户往往感到困惑,不知道如何选择。本文旨在全面解析阿里云服务器实例的各种类型,包括经济型、通用算力型、计算型、通用型和内存型等,以供参考和选择。
|
11月前
|
域名解析 存储 缓存
深入学习 DNS 域名解析
在平时工作中相信大家都离不开 DNS 解析,因为 DNS 解析是互联网访问的第一步,无论是使用笔记本浏览器访问网络还是打开手机APP的时候,访问网络资源的第一步必然要经过DNS解析流程。
|
11月前
|
存储 机器学习/深度学习 缓存
🚀 力扣热题 394:字符串解码(详细解析)(Go语言版)
文章提供了两种解法:栈结构和递归解法。栈解法通过维护数字栈与字符串栈,依次处理 `[` 和 `]`,构造解码结果;递归解法则利用函数调用逐层解析嵌套结构。两者时间复杂度均为 $O(n)$,空间复杂度也为 $O(n)$。栈解法直观易懂,适合初学者;递归解法优雅简洁,适合处理深度嵌套规则。掌握这两种方法,可灵活应对类似问题,提升解题能力。
384 11
|
存储 运维 资源调度
阿里云服务器经济型e实例解析:性能、稳定性与兼顾成本
阿里云经济型e云服务器以其高性价比、稳定可靠的性能以及灵活多样的配置选项,成为了众多企业在搭建官网时的首选。那么,阿里云经济型e云服务器究竟怎么样?它是否能够满足企业官网的搭建需求?本文将从性能表现、稳定性与可靠性、成本考虑等多个方面对阿里云经济型e云服务器进行深入剖析,以供大家参考选择。
741 37
|
11月前
|
存储 机器学习/深度学习 人工智能
阿里云服务器第八代通用型g8i实例评测:性能与适用场景解析
阿里云服务器通用型g8i实例怎么样?g8i实例采用CIPU+飞天技术架构,并搭载最新的Intel 第五代至强可扩展处理器(代号EMR),不仅性能得到大幅提升,同时还拥有AMX加持的AI能力增强,以及全球范围内率先支持的TDX机密虚拟机能力。这些特性使得g8i实例在AI增强和全面安全防护两大方面表现出色,尤其适用于在线音视频及AI相关应用。本文将深入探讨g8i实例的产品特性、优势、适用场景及规格族,以帮助您更好地了解这款产品,以供参考和选择。
|
存储 负载均衡 监控
数据库多实例的深入解析
【10月更文挑战第24天】数据库多实例是一种重要的数据库架构方式,它为数据库的高效运行和灵活管理提供了多种优势。在实际应用中,需要根据具体的业务需求和技术环境,合理选择和配置多实例,以充分发挥其优势,提高数据库系统的性能和可靠性。随着技术的不断发展和进步,数据库多实例技术也将不断完善和创新,为数据库管理带来更多的可能性和便利。
612 57
|
存储 Java 计算机视觉
Java二维数组的使用技巧与实例解析
本文详细介绍了Java中二维数组的使用方法
559 15
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
1437 5
|
存储 网络协议 算法
【C语言】进制转换无难事:二进制、十进制、八进制与十六进制的全解析与实例
进制转换是计算机编程中常见的操作。在C语言中,了解如何在不同进制之间转换数据对于处理和显示数据非常重要。本文将详细介绍如何在二进制、十进制、八进制和十六进制之间进行转换。
2338 5
|
存储 机器学习/深度学习 编解码
阿里云服务器计算型c8i实例解析:实例规格性能及使用场景和最新价格参考
计算型c8i实例作为阿里云服务器家族中的重要成员,以其卓越的计算性能、稳定的算力输出、强劲的I/O引擎以及芯片级的安全加固,广泛适用于机器学习推理、数据分析、批量计算、视频编码、游戏服务器前端、高性能科学和工程应用以及Web前端服务器等多种场景。本文将全面介绍阿里云服务器计算型c8i实例,从规格族特性、适用场景、详细规格指标、性能优势、实际应用案例,到最新的活动价格,以供大家参考。

推荐镜像

更多
  • DNS