C# 将字符串解析为 HighCharts 的数组
本文关键字:HighCharts 数组 字符串 | 更新日期: 2023-09-27 17:57:09
我从网络服务器获取一些格式的动态数据:
Series1
7 2
8 11
9 5
10 4
¤Series2
6 0,1
7 2,2
8 10,4
9 6,9
10 5,1
11 2,7
12 3,9
13 3,6
14 4
15 2,3
16 0,3
17 0
18 0
21 0
22 0
¤Series3
6 0,2
7 2,1
8 9,4
9 6,4
10 4,6
11 2,2
12 3
13 3,2
14 4,3
15 2,2
16 0,6
17 0,1
18 0
21 0
22 0,1
因此,系列名称、x 轴和 y 轴数据用"¤"分隔。
我需要将这些数据放在具有以下所需格式的HighChart图表中:
chart.SetXAxis(new XAxis
{
Categories = new[] { "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }
});
chart.SetSeries(new[]
{
new Series {
Name = "Series1",
Type = DotNet.Highcharts.Enums.ChartTypes.Column,
Data = new Data
(new object[] { 29.9, 71.5, 106.4, 129.2, 144.0, 176.0, 135.6, 148.5, 216.4, 194.1, 95.6, 54.4 }) },
new Series {
Name = "Series2",
Data = new Data
(new object[]{ 129.9, 171.5, 10.4, 29.2, 44.0, 76.0, 35.6, 48.5, 21.4, 19.1, 9.56, 94.4 }) }
}
);
我已经尝试了很多使用大量数组拆分和创建字典来格式化这些数据......但我不断失败。困难的部分之一是,此示例中的 series1 只有 7,8,9,10 (XAxis) 的数据,而另一个系列有 6 到 22 的数据(示例)所以我不能期望所有序列都有相同 x 值的数据。
是否有人具备格式化此数据的算法的知识/技能?:)
您需要做的第一件事是确定通用格式
看着你有什么,我会说你坚持了
弦系列,整数 ID,int[] 线,
须藤代码
seriesString = OriginalString.SplitBySeries
seriesRow = seriesString.SplitByNewLine
series = seriesRow.First
for each row that isn't first
col = row.SplitByWhitespace
id = col.first
cord = col.Last.SplitbyComma
在 C# 中,看起来像
struct DataItem
{
string Series{get;set;}
int ID{get;set;}
int[] Cord{get;set;}
}
string seriesSeperator = <Seperator string>
string colSeperator = <Seperator string>
List<DataItem> items
foreach(string series in OriginalString.Split(seriesSeperator)
{
var rows = serive.Split(Environment.Newline);
var name = series[0];
for(int i = 1;i<series.Lenth;i++)
{
var col = row.Split(colSeperator );
items.Add( new DataIten
{
Series = name,
ID = int.Parse(col[0]),
cord = col[1].Split(",").Select(c=>int.Parse(c)).ToArray()
});
}
}
注意代码仅用于指导,尚未经过测试
然后,一旦你有了项目列表,你就可以构建你的图表了。
尝试下面的代码。我使用StreamReader从文件中读取,但你可以使用StringReader从字符串中读取。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
namespace ConsoleApplication3
{
class Program
{
const string FILENAME = @"c:'temp'test.txt";
public enum State
{
FIND_GROUP,
GET_GROUP
}
static void Main(string[] args)
{
StreamReader reader = new StreamReader(FILENAME);
string inputLine = "";
Series series = null;
State state = State.FIND_GROUP;
while ((inputLine = reader.ReadLine()) != null)
{
inputLine = inputLine.Trim();
if (inputLine.Length > 0)
{
switch (state)
{
case State.FIND_GROUP:
series = new Series();
series.name = inputLine.Replace("�", "");
Series.series.Add(series);
state = State.GET_GROUP;
break;
case State.GET_GROUP:
string[] numbers = inputLine.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
series.values.Add(new KeyValuePair<int, List<int>>(
int.Parse(numbers[0]),
numbers[1].Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(x => int.Parse(x)).ToList()
));
break;
}
}
else
{
state = State.FIND_GROUP;
}
}
}
}
public class Series
{
public string name { get; set; }
public static List<Series> series = new List<Series>();
public List<KeyValuePair<int, List<int>>> values { get; set; }
public Series()
{
values = new List<KeyValuePair<int, List<int>>>();
}
}
}