C# 如何将股票报价数据拆分为列表?
我有一大串股票报价信息。看起来是这样的:C# 如何将股票报价数据拆分为列表?,c#,split,C#,Split,我有一大串股票报价信息。看起来是这样的: Date,Open,High,Low,Close,Volume,Adj Close 2016-05-06,49.919998,50.389999,49.66,50.389999,24715600,50.389999 2016-05-05,49.869999,50.299999,49.73,49.939999,25309500,49.939999 2016-05-04,49.84,50.060001,49.459999,49.869999,24171400
Date,Open,High,Low,Close,Volume,Adj Close
2016-05-06,49.919998,50.389999,49.66,50.389999,24715600,50.389999
2016-05-05,49.869999,50.299999,49.73,49.939999,25309500,49.939999
2016-05-04,49.84,50.060001,49.459999,49.869999,24171400,49.869999...........
如何将其打包到通用列表中
:
在以下假设下
,
分隔,您的输入是一个带有上述模式的长字符串Linq
语句来执行此操作
string input = @"Date,Open,High,Low,Close,Volume,AdjClose,
2016-05-06,49.919998,50.389999,49.66,50.389999,24715600,50.389999,
2016-05-05,49.869999,50.299999,49.73,49.939999,25309500,49.939999,
2016-05-04,49.84,50.060001,49.459999,49.869999,24171400,49.869999";
var stacks = input.Split(new string[] {","}, StringSplitOptions.RemoveEmptyEntries)
.Select((x,i)=> new {index= i/7, item=x }) // split with 7 columns
.Where(x=>x.index !=0) // skip header row.
.GroupBy(x=>x.index)
.Select(x=> new Stack()
{
Date = DateTime.ParseExact(x.First().item.Trim(),"yyyy-MM-dd", CultureInfo.InvariantCulture),
Open = double.Parse(x.Skip(1).First().item),
High = double.Parse(x.Skip(2).First().item),
Low = double.Parse(x.Skip(3).First().item),
Close = double.Parse(x.Skip(4).First().item),
Volume = double.Parse(x.Skip(5).First().item),
AdjClose = double.Parse(x.Skip(6).First().item),
})
.ToList();
检查这个所以,我是这样做的: 我的HiscotricalStock课程:
public class HistoricalStock
{
public DateTime Date { get; set; }
public double Open { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; }
public double Volume { get; set; }
public double AdjClose { get; set; }
}
我使用外部csv文件解决了我的问题(但它是可选的)
List retval=new List();
尝试
{
File.writealText(“G:/Test.csv”),web.DownloadString(string.Format(“http://ichart.finance.yahoo.com/table.csv?s={0}&c={1},股票代码,年月日开始);
}
捕获(FileNotFoundException exc)
{
控制台写入线(exc.Message);
}
StreamReader sr=新的StreamReader(“G:/Test.csv”);
串电流线;
List stoksList=新列表();
//而库存列表不是空的
而((currentLine=sr.ReadLine())!=null)
stoksList.Add(当前行);
//第一行是标题
stoksList.RemoveAt(0);
foreach(stoksList中的字符串str)
{
字符串[]parsedString=str.Split(',');
HistoricalStock hs=新历史股票();
hs.Date=Convert.ToDateTime(解析字符串[0]);
hs.Open=Convert.ToDouble(解析字符串[1]);
hs.High=Convert.ToDouble(解析字符串[2]);
hs.Low=Convert.ToDouble(解析字符串[3]);
hs.Close=Convert.ToDouble(解析字符串[4]);
hs.Volume=Convert.ToDouble(解析字符串[5]);
hs.AdjClose=Convert.ToDouble(解析字符串[6]);
返回。添加(hs);
}
步骤1-将一个大字符串拆分为行。步骤2-将每行拆分为单独的值(一个字符串数组,使用string.split
)。步骤3-将每个值数组转换为股票
。LINQ将简化最后一步的代码。看看这个:或者这是同一只股票的报价?如果不是,你如何区分每只股票的报价?@Steve是的,有苹果的报价。我有5年的股票报价信息。@nooom你有单字符串还是多字符串?在你的例子中,我没有看到两行被任何字符隔开。
public class HistoricalStock
{
public DateTime Date { get; set; }
public double Open { get; set; }
public double High { get; set; }
public double Low { get; set; }
public double Close { get; set; }
public double Volume { get; set; }
public double AdjClose { get; set; }
}
List<HistoricalStock> retval = new List<HistoricalStock>();
try
{
File.WriteAllText("G:/Test.csv", web.DownloadString(string.Format("http://ichart.finance.yahoo.com/table.csv?s={0}&c={1}", ticker, yearToStartFrom)));
}
catch (FileNotFoundException exc)
{
Console.WriteLine(exc.Message);
}
StreamReader sr = new StreamReader("G:/Test.csv");
string currentLine;
List<string> stoksList = new List<string>();
// while stockList isn't empty
while ((currentLine = sr.ReadLine()) != null)
stoksList.Add(currentLine);
// First row is a header
stoksList.RemoveAt(0);
foreach (string str in stoksList)
{
string[] parsedString = str.Split(',');
HistoricalStock hs = new HistoricalStock();
hs.Date = Convert.ToDateTime(parsedString[0]);
hs.Open = Convert.ToDouble(parsedString[1]);
hs.High = Convert.ToDouble(parsedString[2]);
hs.Low = Convert.ToDouble(parsedString[3]);
hs.Close = Convert.ToDouble(parsedString[4]);
hs.Volume = Convert.ToDouble(parsedString[5]);
hs.AdjClose = Convert.ToDouble(parsedString[6]);
retval.Add(hs);
}