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);
                    }