Javascript d3 tsvParser生成包含整个字符串的1列,而不是将其解析为对象
我试图将一个.tsv文件解析为一个对象数组,以便将该数组传递到react stockcharts中以显示图表 以下是react股票图表中的一个工作示例: 我使用Python中的pandas将.tsv文件发送到我的客户端,如下所示:Javascript d3 tsvParser生成包含整个字符串的1列,而不是将其解析为对象,javascript,pandas,csv,d3.js,Javascript,Pandas,Csv,D3.js,我试图将一个.tsv文件解析为一个对象数组,以便将该数组传递到react stockcharts中以显示图表 以下是react股票图表中的一个工作示例: 我使用Python中的pandas将.tsv文件发送到我的客户端,如下所示: return data.to_csv(sep='\t'), 201, {'Access-Control-Allow-Origin': '*'} 我很好地接收到数据,然后用JS的.text()将其转换为字符串: 我可以打印字符串,它看起来和预期的一样。下面是表示前几行
return data.to_csv(sep='\t'), 201, {'Access-Control-Allow-Origin': '*'}
我很好地接收到数据,然后用JS的.text()将其转换为字符串:
我可以打印字符串,它看起来和预期的一样。下面是表示前几行的字符串部分的一个小示例:
"Epoch\tOpen\tHigh\tLow\tClose\tVolume\n2017-08-17 04:00:00+00:00\t4261.48\t4261.48\t4261.48\t4261.48\t1.775183\n2017-08-17 04:01:00+00:00\t4261.48\t4261.48\t4261.48\t4261.48\t0.0\n"
我为react stockcharts创建了一个解析器,以使其采用适当的格式:
const parseDate = timeParse("%Y-%m-%d %H:%M:%S%Z")
然后当我解析它时,就像这样:
str = tsvParse(str, function(d) {
return {
date: parseDate(d.Epoch),
open: d.Open,
high: d.High,
low: d.Low,
close: d.Close,
volume: d.Volume
}
})
return str;
它返回该值,将整个字符串作为1列传递到列数组中,而不是将其解析为对象:
[columns: Array(1)]
columns: ["Epoch\tOpen\tHigh\tLow\tClose\tVolume\n2017-08-17 …0:00\t6577.62\t6577.62\t6577.62\t6577.62\t0.002\n"]
0: "Epoch\tOpen\tHigh\tLow\tClose\tVolume\n2017-08-17 "
length: 1
我尝试使用d3的tsvParseRows,它返回以下内容:
[{…}]
0: {date: null, open: undefined, high: undefined, low: undefined, close: undefined, …}
length: 1
我不知道这意味着什么,但我想我会张贴的情况下,它是有帮助的
为什么要将整个字符串发送到列数组中,而不是正确地解析到对象数组中
代码:
检查此处以获取一个工作示例,该示例演示了我的应用程序在解析.tsv文件时应执行的操作:
这是我的Flask app.py,提供我的.tsv文件:
from flask import Flask
from flask_restful import Api, Resource
from flask_restful import reqparse
import pymarketstore as pymkts
import talib
import pandas as pd
app = Flask(__name__);
api = Api(app)
parser = reqparse.RequestParser()
parser.add_argument('exchange_symbol', type=str, default='binance-BTCUSDT', help='Provide exchange_symbol')
parser.add_argument('interval', type=str, default='1Min', help='Provide interval')
class RSI(Resource):
def get(self):
args = parser.parse_args()
# exchange_symbol = 'binance-BTCUSDT'
# args['interval'] = '1Min'
datatype = 'OHLCV'
param = pymkts.Params(args['exchange_symbol'], args['interval'], datatype)
cli = pymkts.Client('_private_data_source_web_address_goes_here')
reply = cli.query(param)
data = reply.first().df()
return data.to_csv(sep='\t'), 201, {'Access-Control-Allow-Origin': '*'}
api.add_resource(RSI, '/')
if __name__ == '__main__':
app.run(debug=True)
解决方案:
在传递给tsvParse之前需要使用.json(),如下所示:
str = tsvParse(str, function(d) {
return {
date: parseDate(d.Epoch),
open: d.Open,
high: d.High,
low: d.Low,
close: d.Close,
volume: d.Volume
}
})
return str;
破碎的:
.then(res => {
res = res.text()
return res
})
固定的:
.then(res => {
res = res.json()
return res
})
你能发布一篇文章来演示这个问题吗(即,发布获取和解析TSV所涉及的整个代码块,以确保没有任何其他因素影响文本解析)。@ialarmedalien是的,我编辑了我的文章,其中包含了你可以直接使用--just do
d3.TSV('data.TSV',function(d))解析TSV的代码{…
您使用的是d3.tsvParse
——无需进行任何额外的字符串转换。@ialarmedalien在更改为tsv:export function getData(){const promiseCompare=tsv(“)。然后(function(data){data.forEach(function(d))之后,我得到了与以前使用tsvParse时完全相同的答案{d.date=parseDate(d.date);d.open=+d.open;d.high=+d.high;d.low=+d.low;d.close=+d.close;d.volume=+d.volume;})返回数据})返回承诺比较;}如果你在中做的第一件事是控制台日志(数据)
,你会得到什么{…}
?