首页 > 解决方案 > d3 tsvParser 导致 1 列包含整个字符串,而不是将其解析为对象

问题描述

我正在尝试将 .tsv 文件解析为对象数组,以便可以将数组传递给 react-stockcharts 以显示图表。

这是 react-stockcharts 的一个工作示例:https ://codesandbox.io/s/2ox5z7w310

我在 Python 中使用 pandas 将 .tsv 文件发送到我的客户端,如下所示:

return data.to_csv(sep='\t'), 201, {'Access-Control-Allow-Origin': '*'}

我很好地接收到数据,然后使用 JS 的 .text() 将其转换为字符串:

.then(res => {
  res = res.text()
  return res
})

我可以打印字符串,它看起来像预期的那样。下面是代表前几行的字符串部分的一个小示例:

"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 文件时应该做什么:https ://codesandbox.io/s/74rn0km99q

这是我的 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(),如下所示:

破碎的:

.then(res => {
  res = res.text()
  return res
})

固定的:

.then(res => {
  res = res.json()
  return res
})

标签: javascriptpandascsvd3.js

解决方案


推荐阅读