如何解析这个 OFX 文件?

2024-04-27

这是原始 ofx 文件,因为它来自 m 银行(不用担心,没有什么敏感信息,我剪掉了所有交易的中间部分)

开放金融交易所(OFX)是一个 用于交换的数据流格式 演变的财务信息 来自微软的开放金融 连接 (OFC) 和 Intuit 的 Open 交换文件格式。

现在我需要解析这个。我已经看到了question https://stackoverflow.com/questions/2221608/how-to-parse-a-malformed-xml-ofx-with-ofx4j,但这不是重复,因为我对如何做到这一点感兴趣。

我确信我可以找出一些聪明的正则表达式来完成这项工作,但这很丑陋并且容易出错(如果格式更改,某些字段可能会丢失,格式/空格不同等等......)

OFXHEADER:100
DATA:OFXSGML
VERSION:102
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE
<OFX>
    <SIGNONMSGSRSV1>
        <SONRS>
            <STATUS>
                <CODE>0
                <SEVERITY>INFO
            </STATUS>
            <DTSERVER>20110420000000[+1:CET]
            <LANGUAGE>ENG
        </SONRS>
    </SIGNONMSGSRSV1>
    <BANKMSGSRSV1>
        <STMTTRNRS>
            <TRNUID>1
            <STATUS>
                <CODE>0
                <SEVERITY>INFO
            </STATUS>
            <STMTRS>
                <CURDEF>EUR
                <BANKACCTFROM>
                    <BANKID>20404
                    <ACCTID>02608983629
                    <ACCTTYPE>CHECKING
                </BANKACCTFROM>
                    <BANKTRANLIST>
                    <DTSTART>20110207
                    <DTEND>20110419
                    <STMTTRN>
                        <TRNTYPE>XFER
                        <DTPOSTED>20110205000000[+1:CET]
                        <TRNAMT>-6.12
                        <FITID>C74BD430D5FF2521
                        <NAME>unbekannt
                        <MEMO>BILLA DANKT  1265P K2 05.02.UM 17.49 
                    </STMTTRN>
                    <STMTTRN>
                        <TRNTYPE>XFER
                        <DTPOSTED>20110207000000[+1:CET]
                        <TRNAMT>-10.00
                        <FITID>C74BE0F90A657901
                        <NAME>unbekannt
                        <MEMO>AUTOMAT  13177 KARTE2 07.02.UM 10:22 
                    </STMTTRN>
............................. goes on like this ........................
                    <STMTTRN>
                        <TRNTYPE>XFER
                        <DTPOSTED>20110418000000[+1:CET]
                        <TRNAMT>-9.45
                        <FITID>C7A5071492D14D29
                        <NAME>unbekannt
                        <MEMO>HOFER DANKT  0408P K2 18.04.UM 18.47 
                    </STMTTRN>
                </BANKTRANLIST>
                <LEDGERBAL>
                    <BALAMT>1992.29
                    <DTASOF>20110420000000[+1:CET]
                </LEDGERBAL>
            </STMTRS>
        </STMTTRNRS>
    </BANKMSGSRSV1>
</OFX>

我目前使用这段代码,它给了我想要的结果:

<?

$files = array();
$files[] = '***_2011001.ofx';
$files[] = '***_2011002.ofx';
$files[] = '***_2011003.ofx';

system('touch file.csv && chmod 777 file.csv');
$fp = fopen('file.csv', 'w');

foreach($files as $file) {
    echo $file."...\n";
    $content = file_get_contents($file);

    $content = str_replace("\n","",$content);
    $content = str_replace(" ","",$content);

    $regex = '|<STMTTRN><TRNTYPE>(.+?)<DTPOSTED>(.+?)<TRNAMT>(.+?)<FITID>(.+?)<NAME>(.+?)<MEMO>(.+?)</STMTTRN>|';


    echo preg_match_all($regex,$content,$matches,PREG_SET_ORDER)." matches... \n";


    foreach($matches as $match) {
        echo ".";
        array_shift($match);
        fputcsv($fp, $match);
    }
    echo "\n";
}
echo "done.\n";
fclose($fp);

这真的很难看,如果这是一个有效的 xml 文件,我个人会为此自杀,但如何做得更好呢?


考虑到该文件不是 XML 甚至 SGML,您的代码看起来不错。您唯一能做的就是尝试制作一个更通用的类似 SAX 的解析器。也就是说,您只需一次一个块地浏览输入流(其中块可以是任何内容,例如一行或只是一组字符)。然后,每次遇到异常时调用回调函数<ELEMENT>。您甚至可以像构建解析器类一样幻想,在其中可以注册侦听特定元素的回调函数。

它将更加通用并且不那么“丑陋”(对于“丑陋”的某些定义),但是需要维护更多的代码。如果您需要大量解析此文件格式(或许多不同的变体),那么这样做很高兴,也很高兴拥有。如果您发布的代码是您执行此操作的唯一位置,那么只需KISS http://en.wikipedia.org/wiki/KISS_principle.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何解析这个 OFX 文件? 的相关文章

  • 如何仅提取 mysql 和 php 中具有非零值的列?

    我正在尝试从 mysql 数据库中提取并显示在网页上 仅非零列 哪一列的日期是 0000 00 00 我不想在网页上显示这些列 下面分别是HTML代码和php脚本
  • 如何选择使用默认命名空间的节点?

    XML 文件的结构大致如下 a b b a
  • 如何在 PHP 中检查特定类型的对象

    我有一种方法 它接受 PDO 对象作为参数 允许用户使用现有连接 而不是打开新连接的方法 并节省资源 public static function databaseConnect pdo null 我知道is object 检查参数是否是一
  • 防止刷新时提交双重表单

    我有一个简单的问题 我知道当用户使用 Post Redirect Get 模式重新加载页面时 我可以防止表单重新提交自身 但我的问题是 如果我将用户重定向回提交表单的同一页面 这种模式是否有效 我的意思是 我不想将用户重定向到另一个页面 请
  • 严格标准:在 wordpress/wp-includes/class-oembed.php 第 116 行中,仅应通过引用传递变量

    我已经查看了很多类似的问题 但关于我的代码 我没有得到它 错误 Strict Standards Only variables should be passed by reference in wordpress wp includes c
  • Codeigniter HMVC Ajax

    我的问题需要一些帮助 我有一个用户列表 我想在 CI HMVC 中使用 ajax 删除用户 onclick 删除按钮 这是我的列表视图的代码 function tip del click function var recId this da
  • (无限?)JavaScript 代码中的循环

    我有以下 JavaScript 代码来在网站上 显示 XML function createChild node tabindex var child node childNodes var r var tabs for i 0 i
  • 将文本视图添加到布局中?

    如果我的按钮不移动 我就无法在按钮上方放置文本视图 我该如何解决这个问题 被困在这个问题上 4 个小时了 这很伤心 因为我正在尝试在我的布局上添加一个文本视图 我的布局中心有 4 个按钮 我只想在四个按钮上方添加一个文本视图 如下所示 Te
  • XPath 获取没有父节点的所有子节点(元素、注释和文本)

    我需要一个 XPath 来获取所有没有父元素的子节点 包括文本元素 注释元素和子元素 任何帮助 示例示例
  • html iframe 中的字符错误

    对不起我的英语我说西班牙语 我正在尝试显示多个php and mysql将在 iframe 内显示的注册 问题是 iframe 向我显示特殊字符的错误 例如 重音符号 感叹号等 D ndecuestamenosyseconsumem s 这
  • PHP 中的 Javascript“unes​​cape”

    我的图像主机有一个 Google Chrome 扩展程序 它会向我的网站发送一个 URL 该网址得到encoded通过 JavaScript 的escape method 编码的 URLescape看起来像这样 http 253A 4 bp
  • 解析器生成

    我正在做一个项目软件抄袭检测 我打算用C语言来做这件事 因为我应该创建一个令牌生成器和一个解析器 但我不知道从哪里开始 任何人都可以帮助我解决这个问题 我创建了一个令牌数据库 并将令牌与我的程序分开 接下来我想做的就是比较两个程序以查明它是
  • 为什么 PCRE 正则表达式比 C++11 正则表达式快得多

    一些示例代码 这是使用 cregex iterator 的 c 11 部分 std chrono steady clock time point begin0 std chrono steady clock now regex re
  • 无法在 PowerShell 中完全解析 XML

    我有一个 XML 文件 我想解析该文件并检索特定信息 为了便于理解 下面是 XML 文件的屏幕截图 我想解析 XML 并为每个Item节点 检索屏幕截图中指示的字段 检索到的每个值都需要针对每个项目节点进行格式化 最后 我希望能够指定一个要
  • jQuery:评估 ajax 响应中的脚本

    来自我的 web 应用程序的 XML 响应既有要添加到页面的 HTML 也有要运行的脚本 我正在尝试从我的网络应用程序发回 XML 例如
  • 使用 Doctrine2 时的多重歧视级别

    我正在使用 Doctrine2 来管理我的模型 如下 有一个抽象概念Content与复合模式Gallery 也是一个抽象概念Media从中Video and Image继承 我的选择是添加鉴别器Content and Media表以便区分G
  • 使用 bcrypt-ruby 使用版本 $2y 验证哈希密码

    我们陷入了困境 需要使用 Ruby 根据现有的用户数据库对用户进行身份验证 用户的密码都是使用password compat PHP库生成的 所有散列密码均以 2y 开头 我一直在使用 bcrypt ruby 尝试对用户进行身份验证 但没有
  • AngularJS + Laravel 5 身份验证

    在使用 AngularJS 构建 SPA 时 我想在 AngularJS 网站中实现用户身份验证 但是 我不知道从哪里开始以及最佳实践是什么 基本上我有一个确定可以担任一个或多个角色 我寻找了一些例子 这样我就可以对如何正确处理这个问题有一
  • 如何在sql中查询xml列

    我在 SQL Server 2008 上有一个表 T1 其中包含一个 XML 列 EventXML 我想查询某个节点包含特定值的所有行 更好的是 我想检索不同节点中的值 表T1 T1 EventID int EventTime dateti
  • Python正则表达式:如何用不同的值替换出现的每个实例?

    假设我有这个字符串 s blah blah blah 使用Python正则表达式 如何用不同的值替换 blah 的每个实例 例如 我有一个值列表v 1 2 3 你可以使用re sub打回来 http docs python org libr

随机推荐

  • System.Windows.Application.GetResourceStream 返回 null

    如果我调试一个以 Catalog xaml 作为内容的 WPF 应用程序 我无法获取它的资源流 GetResourceStream 返回 null var uri new Uri Assembly component Catalog xam
  • 如何从 Flask 调用另一个 Web 服务 api

    我在 Flask 服务器中使用重定向来调用另一个 Web 服务 api e g app route hello def hello return redirect http google com 网址逻辑上会更改为 google com 但
  • 如何在 psql 中使用数组包含值子句进行选择

    我有专栏arr这是类型array 我需要获取行 在哪里arr列包含值s 这个查询 SELECT FROM table WHERE arr gt ARRAY s 给出错误 错误 运算符不存在 字符变化 gt 文本 为什么它不起作用 附注我知道
  • 只响应第一个 WM_KEYDOWN 通知?

    Win32 应用程序如何仅响应第一个 WM KEYDOWN 通知 MSDN 文档声称第 30 位 指定先前的按键状态 如果在发送消息之前按键处于按下状态 则该值为 1 如果按键处于按下状态 则该值为 0 但在我的 WndProc 中 第 3
  • 在 shell 中将 ANSI 转换为 UTF-8

    我正在制作一个解析器 1 csv 到 3 csv 脚本 但遇到问题 我是法国人 所以用我的语言我有这样的字母 一位客户向我发送了一个 csv 文件 Linux 将其识别为 unknown 8bit 我猜是 ansi 在我的脚本中 我正在编写
  • 格式化文本文件,解析完成后如何更新文件?

    如何打开文件 对文件执行一些正则表达式 然后保存文件 我知道我可以打开一个文件 逐行读取 但是如何更新文件的实际内容然后保存文件 无论文件大小如何 以下方法都可以工作 并且如果操作在完成之前失败 也不会损坏原始文件 string input
  • 计算向量中连续 1 和 0 的数量

    在 Matlab 中我有一个如下所示的向量 0 0 1 1 0 0 0 1 1 0 0 0 0 1 1 1 0 0 0 0 1 0 1 我现在要做的是统计这个向量中1的个数 连续的 1 算作 1 此外 我还想计算 1 之间 0 的平均值和中
  • CTYPE_ALNUM 的奇怪之处

    我的 PHP 函数 CTYPE ALNUM 有一个奇怪的问题 if i do PHP words if ctype alnum words Echo Don t work else Echo Work 这将回显 工作 但是如果我有一个表格
  • 导入图标动态反应 fontawesome

    我在 React js 项目中使用 FontawesomeIcon 图标的名称来自数据库 我想动态地从 fortawesome free solid svg icons 导入来自数据库的图标 import React Component f
  • jQuery 替换 href 值但仅部分替换? [复制]

    这个问题在这里已经有答案了 可能的重复 使用 jQuery 更改 href 参数 https stackoverflow com questions 6540106 change href parameter using jquery 我有
  • 当 MATLAB 发生错误时如何继续循环?

    我正在使用函数将一些 dat 文件转换为 mat 文件 我在循环内调用此函数来转换多个文件 在某些情况下 我的 dat 文件已损坏 函数无法转换并发生错误 从而停止循环 现在我的问题是 是否有任何命令 当错误发生时 它应该跳过循环中的当前
  • 在 Three.js 中将贝塞尔曲线转换为平面道路

    我试图根据之前计算得到的一些贝塞尔曲线在 Three js 中绘制一条弯曲的道路 问题是我找不到转换曲线序列的方法 一条从上一条曲线的末尾开始 到一个曲面 我有一个 3D 场景 其中有一些汽车 一条用飞机创建的道路 并且绘制了即将到来的道路
  • 如何在 Qt 5 中写入和读取 QResource 文件?

    很奇怪 我通过以下方式将所需的文件添加到资源中添加现有文件 文件就在那里 我运行 qmake 构建 gt 运行 qmake 以使文件可用 第一期 我无法从输出终端向文件写入任何内容 但是当我手动写入文件时 每次运行它时输出终端都会显示更改
  • 如何使 QTreeWidget 中的特定列成为整数/浮点数,以便用户无法输入任何字母或符号而不是整数/浮点数?

    我正在 PyQt5 中使用 QTreeWidget 制作 GUI 我希望特定列仅是整数列 用户不应该能够在其中输入任何非整数项 我看到了一些使用 QVariant 的方法 但它似乎不能满足我的要求 这就是我的found https stac
  • 如何获取 App Engine 前端服务器的实例 ID?

    有没有办法直接向该服务器发送请求 实际上有一种方法 它可以将新数据推送到应用程序的所有实例 from google appengine api import modules instance id modules get current i
  • 以编程方式更改工具栏中的菜单图标颜色

    我开发了一个应用程序 用户可以在其中更改主题 我有一个导航视图 工具栏中有一个黑色的菜单图标 我想更改该图标 将其设置为白色 在黑色主题上 我尝试了这段代码 但它仍然是黑色的 myToolbar setTitleTextColor Colo
  • 如何在Python中访问超类的类属性?

    看一下下面的代码 class A object defaults a 1 def getattr self name print A getattr return self get default name classmethod def
  • 在 Python 中使用 glob.glob 和带有 unicode 文件名的正则表达式的独立于文件系统的方式

    我正在开发一个库 我想保持平台 文件系统和 Python2 x 3 x 的独立性 但是 我不知道如何以独立于平台 文件系统的方式全局查找文件并将文件名与正则表达式进行匹配 例如 在 Mac 上 使用 IPython Python 2 7 I
  • 在 Node.js / Express 中,如何“下载”页面并获取其 HTML?

    在代码中 我想下载 http www google com 并将其存储在字符串中 我知道如何在 python 的 urllib 中做到这一点 但是如何在 Node JS Express 中做到这一点呢 var util require ut
  • 如何解析这个 OFX 文件?

    这是原始 ofx 文件 因为它来自 m 银行 不用担心 没有什么敏感信息 我剪掉了所有交易的中间部分 开放金融交易所 OFX 是一个 用于交换的数据流格式 演变的财务信息 来自微软的开放金融 连接 OFC 和 Intuit 的 Open 交