Javascript 导入文件预览

Javascript 导入文件预览,javascript,jquery,parsing,ofx,Javascript,Jquery,Parsing,Ofx,我有这个表单,它导入用户的事务。我改进了表单,用户可以预览将要导入其帐户的交易列表 样本: 上面的示例预览是针对我成功完成的QIF文件格式的 现在我正在尝试预览OFX文件格式,但我很难将其排列在一个表中并获得准确的值 这是我的密码: <input type="file" name="transactions" id="id_transactions"> <div style="display:none;width:335px;" id="preview-box">

我有这个表单,它导入用户的事务。我改进了表单,用户可以预览将要导入其帐户的交易列表

样本:

上面的示例预览是针对我成功完成的QIF文件格式的

现在我正在尝试预览OFX文件格式,但我很难将其排列在一个表中并获得准确的值

这是我的密码:

<input type="file" name="transactions" id="id_transactions">

<div style="display:none;width:335px;" id="preview-box">
    <h4 class="thin" class="black">Import Preview</h4>

    <table class="simple-table responsive-table footable">
        <thead>
            <tr>
                <th scope="col" width="10%"><small class="black">Date</small></th>
                <th scope="col" width="10%"><small class="black">Amount</small></th>
                <th scope="col" width="20%"><small class="black">Payee</small></th>
            </tr>
        </thead>
    </table>

    <div class="scrollable" style="height:100px">
        <table class="simple-table responsive-table footable">
            <tbody id="preview-table"></tbody>
        </table>
    </div><br/>
</div> 

<script>
    $('#id_transactions').change(function() {
        var upload = document.getElementById('id_transactions')
        var files = upload.files
        if (files != undefined) {
            var reader = new FileReader();

            reader.onload = function(e) {
                var extension = upload.value.split('.').pop().toLowerCase()
                var lineSplit = e.target.result.split("\n");
                var payee = ''
                var date
                var amount
                var content = "";
                var content1 = "";
                var content2 = "";

                if(extension == "qif"){
                    // for qif preview
                }else if(extension == "ofx"){
                    $('#preview-box').show(500)

                    for(var i = 1; i < lineSplit.length; i++) {
                        //I'm stuck here....
                    }
                }

                $('#preview-table').html(content);
            };
            reader.readAsText(files.item(0));
        }
    });
</script>

导入预览
日期
数量
受款人

$('#id_事务')。更改(函数(){ var upload=document.getElementById('id\u事务') var files=upload.files 如果(文件!=未定义){ var reader=new FileReader(); reader.onload=函数(e){ var extension=upload.value.split('.').pop().toLowerCase() var lineSplit=e.target.result.split(“\n”); var收款人=“” 风险值日期 风险值金额 var-content=“”; var content1=“”; var content2=“”; 如果(扩展名=“qif”){ //用于qif预览 }else if(扩展名=“ofx”){ $(“#预览框”).show(500) 对于(变量i=1;i
样本ofx

 OFXHEADER:100
DATA:OFXSGML
VERSION:103
SECURITY:NONE
ENCODING:USASCII
CHARSET:1252
COMPRESSION:NONE
OLDFILEUID:NONE
NEWFILEUID:NONE

<OFX>
  <SIGNONMSGSRSV1>
    <SONRS>
      <STATUS>
        <CODE>0
        <SEVERITY>INFO
      </STATUS>
      <DTSERVER>20071015021529.000[-8:PST]
      <LANGUAGE>ENG
      <DTACCTUP>19900101000000
      <FI>
        <ORG>MYBANK
        <FID>01234
      </FI>
    </SONRS>
  </SIGNONMSGSRSV1>
  <BANKMSGSRSV1>
      <STMTTRNRS>
        <TRNUID>23382938
        <STATUS>
          <CODE>0
          <SEVERITY>INFO
        </STATUS>
        <STMTRS>
          <CURDEF>USD
          <BANKACCTFROM>
            <BANKID>987654321
            <ACCTID>098-121
            <ACCTTYPE>SAVINGS
          </BANKACCTFROM>
          <BANKTRANLIST>
            <DTSTART>20070101
            <DTEND>20071015
            <STMTTRN>
              <TRNTYPE>CREDIT
              <DTPOSTED>20070315
              <DTUSER>20070315
              <TRNAMT>200.00
              <FITID>980315001
              <NAME>DEPOSIT
              <MEMO>automatic deposit
            </STMTTRN>
            <STMTTRN>
              <TRNTYPE>CREDIT
              <DTPOSTED>20070329
              <DTUSER>20070329
              <TRNAMT>150.00
              <FITID>980310001
              <NAME>TRANSFER
              <MEMO>Transfer from checking
            </STMTTRN>
            <STMTTRN>
              <TRNTYPE>PAYMENT
              <DTPOSTED>20070709
              <DTUSER>20070709
              <TRNAMT>-100.00
              <FITID>980309001
                <CHECKNUM>1025
              <NAME>John Hancock
            </STMTTRN>
          </BANKTRANLIST>
          <LEDGERBAL>
            <BALAMT>5250.00
            <DTASOF>20071015021529.000[-8:PST]
          </LEDGERBAL>
          <AVAILBAL>
            <BALAMT>5250.00
            <DTASOF>20071015021529.000[-8:PST]
          </AVAILBAL>
        </STMTRS>
      </STMTTRNRS>
  </BANKMSGSRSV1>
</OFX>
xheader的
of:100
数据:OFXSGML
版本:103
保安:无
编码:USASCII
字符集:1252
压缩:无
OLDFILEUID:无
NEWFILEUID:无
0
信息
20071015021529.000[-8:PST]
英格
19900101000000
我的银行
01234
23382938
0
信息
美元
987654321
098-121
储蓄
20070101
20071015
信用
20070315
20070315
200
980315001
押金
自动存款
信用
20070329
20070329
150
980310001
转移
转帐
付款
20070709
20070709
-100.00
980309001
1025
约翰·汉考克
5250
20071015021529.000[-8:PST]
5250
20071015021529.000[-8:PST]
有人已经做过了吗

更新:

输出:


你知道吗,这种OFX文件格式在第二部分看起来很像XML,两部分之间有一条空行(如果我错了,请纠正我,我不知道这种格式)

onload
事件侦听器中,尝试以下操作:

var ofxParts = e.result.split("\r?\n\r?\n"), ofxHeaders, ofxDocument;

ofxHeaders = JSON.parse("{"
    + ofxParts[0].replace(/(\w+) *: *(\w*)/g, "\"$1\": \"$2\"")
        .replace(/\r?\n/g, ", ") + "}");

ofxDocument = new DOMParser().parseFromString(ofxParts[1]
        .replace(/<(\w+)>(?!\n|\r\n)(.*)/g, "<$1>$2</$1>"));
ofxHeaders = {
    "OFXHEADER": "100",
    "DATA": "OFXSGML",
    "VERSION": "103",
    "SECURITY": "NONE",
    "ENCODING": "USASCII",
    "CHARSET": "1252",
    "COMPRESSION": "NONE",
    "OLDFILEUID": "NONE",
    "NEWFILEUID": "NONE"
};
您可以使用
文档爬网并选择OFX文档。像其他XML一样评估

只要您正在使用
FileReader
,这一切都应该可用。除了IE10,它不支持
文档。评估
。如果要使用XPath,必须创建一个
ActiveXObject
并使用
loadXML

也可以使用jQuery:

var $ofx = $.parseXML(ofxParts[1].replace(/<(\w+)>(?!\n|\r\n)(.*)/g, "<$1>$2</$1>"));
var$ofx=$.parseXML(ofxParts[1]。替换(/(?!\n |\r\n)(.*)/g,“$2”);
编辑:您现在可以用这种方式创建表的行:

var $xfers = $ofx.find("STMTTRN");

content = $xfers.map(function(xf) {
    var $xf = $(xf), date = $xf.find("DTPOSTED").text();
    return "<tr><td>" + date.substring(4, 6) + "/" + date.substring(6)
        + "/" + date.substring(0, 4) + "<td></td>" + $xf.find("NAME").text()
        + "</td><td>" + $xf.find("TRNAMT").text() + "</td></tr>";
}).join("");
var$xfers=$ofx.find(“STMTTRN”);
content=$xfers.map(函数(xf){
var$xf=$(xf),date=$xf.find(“DTPOSTED”).text();
返回“+日期.子字符串(4,6)+”/“+日期.子字符串(6)
+“/”+date.substring(0,4)+“+$xf.find(“NAME”).text()
+“+$xf.find(“TRNAMT”).text()+”;
}).加入(“”);

你是不是碰巧需要一个OFX解析器?@MaxArt否,我已经用python阅读了这个文件。我真正需要的是使用javascript或jquery来读取这个文件进行预览。好的,但是如果你想以一种体面的形式显示它的内容,你还是需要一个解析器。或者你想把它显示成一堵文字墙?@MaxArt我想不是,在我的代码中,我已经在使用这个表了。我成功地读取了QIF文件格式,我将其排列在表中,而不使用解析器或任何东西(它是纯javascript)。我相信这在javascript或jquery中是可能的。是的,使用解析器。事实上,它是一个Javascript解析器。为了读取QIF文件,您还使用了Javascript解析器。那么,您是否需要一个OFX文件?这里的主要问题是什么,读取用户选择的文件或在表中显示其内容?或者两者都有?我会更新我的问题以获得输出。就像我说的,我没有使用解析器。我只是简单地使用了
if和else语句
,但如果您想使用该解析器,我会尝试一下。我想
读取用户选择的文件并在表中显示其内容
。是的,这就像XML,这就是为什么我在获取输出时遇到困难的原因。@catherine你看,即使你说“我只是在使用
if
else
”,你在那里做的是一项解析工作。您实际上编写了自己的解析器。我试着让你成为这个答案中的一员。那么,它能工作吗?或者我必须稍微调整一下吗?ofxheader不包括在输出中。请参阅我问题中的输出。如果你能解决这个问题,我会给你赏金:)。它必须排列在表中。@catherine好的,我添加了一个片段,将数据放入表中。请注意,您尚未提供有关w的任何信息