由此实例学习Virtools脚本语言VSL – 解析字符串

该习题演示解析字符串及用字符串中涵盖的音讯填充数组(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;

        }

    }
  1. 编译VSL脚本并运维。要确认那多少个数组中的内容如下:
[![](https://sites.google.com/site/x3dofcn/_/rsrc/1245403946960/vsl-virtools/Examples/4_parse-string/vsl_parse1.png)](https://sites.google.com/site/x3dofcn/vsl-virtools/Examples/4_parse-string/vsl_parse1.png?attredirects=0)



你可以看到,"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);

    }
  1. 修改你的代码,要包涵地点的函数。你的代码将来理应是像那一个样子:

    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;

        }

    }


现在,在把单词插入数组之前,新的函数检查字符串并对之修改(如果有必要) -
移除换行符。  
  1. 编译你的VSL脚本并运维。你的数组以往是还是不是看起来好多了?
[![](https://sites.google.com/site/x3dofcn/_/rsrc/1245403976002/vsl-virtools/Examples/4_parse-string/vsl_parse2.png)](https://sites.google.com/site/x3dofcn/vsl-virtools/Examples/4_parse-string/vsl_parse2.png?attredirects=0)

相关文章