搜索文本文件并计算某些短语在 Octave 中出现的次数

问题描述 投票:0回答:1

我正在尝试在 Octave 中编写一个脚本来扫描一个 .bsg 文件,该文件用于游戏“围攻”来存储创作,并计算每个块的数量。然后它应该为每个块计算一个具有预定成本的总分。 .bsg 文件是 xml 格式,可以用文本编辑器打开。

这是它可能正在扫描的一小部分内容:

<Blocks>
        <Block id="0" guid="fdc9868c-e86d-48eb-b8e1-03eeb45d49fa">
            <Transform>
                <Position x="0.875" y="0.9999993" z="-9" />
                <Rotation x="-4.371139E-08" y="1" z="4.371139E-08" w="1.910685E-15" />
                <Scale x="1" y="1" z="1" />
            </Transform>
            <Data />
        </Block>
        <Block id="35" guid="02c86448-e87e-4d8f-92c5-b1c923b7f538">
            <Transform>
                <Position x="0.875" y="-0.5000007" z="0" />
                <Rotation x="-0.707107" y="-6.181725E-08" z="-6.181723E-08" w="0.7071066" />
                <Scale x="5.000033" y="12" z="1.000004" />
            </Transform>
            <Data>
                <Single key="bmt-mass">100</Single>
                <Boolean key="bmt-scale">True</Boolean>
                <Single key="bmt-x-scale">5</Single>
                <Single key="bmt-y-scale">12</Single>
                <Single key="bmt-z-scale">1</Single>
            </Data>
        </Block>

所以我的问题是我不知道如何去做,因为我是编码新手。我查看了加载、扫描、文本读取,但似乎无法使用我的文件进行任何操作。

octave
1个回答
0
投票

基本上您需要做的是解析 XML 文档。对于此任务,您不必手动读取文件(使用扫描、文本读取等...)。你需要一个能为你做这件事的图书馆。

不幸的是,Octave 不是这类任务的好选择。我建议使用像 Python 这样的现代脚本语言来解决这个任务。它会更容易和高效。

但是如果您必须使用 Octave 来解决它,这里有一些入门提示(我假设您使用的是 Linux 操作系统):

  1. 安装 liboctave-dev 包(如果系统中没有),在终端中运行:
sudo apt update 
sudo apt install liboctave-dev 
  1. 下载Octave IO包:https://octave.sourceforge.io/io/

  2. 安装包(从 Octave 控制台运行此命令,“install io-2.6.4.tar.gz”应该在当前目录中):

pkg install io-2.6.4.tar.gz
  1. 从这里下载Apache Xerces二进制文件:https://xerces.apache.org/mirrors.cgi#binary 现在最新版本的直接 URL 是:https://dlcdn.apache.org//xerces/j/binaries/Xerces-J-bin.2.12.2.tar.gz

并解压缩存档(它将被解压缩到名为“xerces-2_12_2”的目录中)

  1. 把这个目录放在项目目录下(你存放*.m文件的地方)

  2. 创建一个新的*.m文件并粘贴:

pkg load io

javaaddpath ("./xerces-2_12_2/xercesImpl.jar");
javaaddpath ("./xerces-2_12_2/xml-apis.jar");

clc
clear

xmlTree = xmlread("test.xml")
  1. 现在运行脚本。假设您在项目目录中有一个“test.xml”文件,并且它是一个正确的 XML 文件,您应该在 Octave 的控制台中获得以下输出:
xmlTree =

<Java object: org.apache.xerces.dom.DeferredDocumentImpl>

这意味着 xmlread 方法有效。

从现在开始,您可以使用 Xerces 的 API 方法解析 XML 树。有关详细信息,请参阅文档:https://xerces.apache.org/xerces-j/apiDocs/org/apache/xerces/dom/package-tree.html

一种方法可能是使用此处的 xml2struct 脚本:https://mathworks.com/matlabcentral/fileexchange/28518-xml2struct

但它不会在 Octave 上“按原样”工作(因为 Octave 与 Matlab 不完全兼容)。你需要修改它。一个特定的部分会像这样的线条:

theAttributes = getAttributes(theNode); % Matlab syntax

你必须将它重写为 Octave 语法——像这样:

theAttributes = theNode.getAttributes; % Octave syntax

可能还需要进行一些其他修改。

之后,您将能够从结构中检索您关心的数据并对其进行操作(计算“块”或您需要做的任何事情)。

© www.soinside.com 2019 - 2024. All rights reserved.