Javascript 导入文件预览
我有这个表单,它导入用户的事务。我改进了表单,用户可以预览将要导入其帐户的交易列表 样本: 上面的示例预览是针对我成功完成的QIF文件格式的 现在我正在尝试预览OFX文件格式,但我很难将其排列在一个表中并获得准确的值 这是我的密码: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">
<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的任何信息