public static async Task <List <IndexQuotation> > GetIndexQuotations(DateTime begin, DateTime end, params string[] codes) { using (var client = new HttpClient()) { var indexCode = string.Join("','", codes); var url = $"http://www.swsindex.com/handler.aspx?tablename=swindexhistory&key=id&p={{0}}&where=swindexcode in ('{indexCode}') and " + $"BargainDate>='{begin.ToString("yyyy-MM-dd")}' and BargainDate<='{end.ToString("yyyy-MM-dd")}'&orderby=swindexcode asc,BargainDate_1&" + $"fieldlist=SwIndexCode,SwIndexName,BargainDate,CloseIndex,BargainAmount,Markup,OpenIndex,MaxIndex,MinIndex,BargainSum&pagecount=13664"; var page = 1; var result = new List <IndexQuotation>(); while (true) { Log.Information($"获取申万指数行情数据('{indexCode}') {begin}~{end} 第{page}页数据..."); var json = await client.GetStringAsync(string.Format(url, page)); var data = json?.Replace('\'', '"').ToObj <JObject>()?["root"]; if (data == null || !data.Any()) { return(result); } foreach (var item in data) { var quotation = new IndexQuotation { IndexCode = item["SwIndexCode"].ToString(), IndexName = item["SwIndexName"].ToString() }; DateTime.TryParse(item["BargainDate"].ToString(), out DateTime date); decimal.TryParse(item["CloseIndex"].ToString(), out decimal close); decimal.TryParse(item["BargainAmount"].ToString(), out decimal vol); decimal.TryParse(item["Markup"].ToString(), out decimal markup); decimal.TryParse(item["OpenIndex"].ToString(), out decimal open); decimal.TryParse(item["MaxIndex"].ToString(), out decimal max); decimal.TryParse(item["MinIndex"].ToString(), out decimal min); decimal.TryParse(item["BargainSum"].ToString(), out decimal amount); quotation.Date = date; quotation.Close = close; quotation.Volume = vol * 10000; quotation.Markup = markup / 100; quotation.Open = open; quotation.Max = max; quotation.Min = min; quotation.Amount = amount; result.Add(quotation); } page++; } } }
private static void LoadFiles() { var files = Directory.GetFiles("data"); if (!files.Any()) { return; } foreach (var f in files) { if (!f.EndsWith(".xls") && !f.EndsWith(".xlsx") && !f.EndsWith(".xlsb")) { continue; } var file = new FileInfo(f); var version = DataDao.GetFileVersion(file.FullName); if (version != null && file.LastWriteTime <= version.LastWriteTime) { continue; } using (var stream = File.OpenRead(f)) using (var reader = ExcelReaderFactory.CreateReader(stream)) { var result = reader.AsDataSet(); var rows = result?.Tables?[0]?.Rows; if (rows == null || rows.Count <= 0) { continue; } if (!IsQuotation(rows[0])) { continue; } var quotations = new List <IndexQuotation>(); for (int i = 1; i < rows.Count; i++) { if (string.IsNullOrWhiteSpace(rows[i][0]?.ToString())) { break; } var quotation = new IndexQuotation { IndexCode = rows[i][0].ToString(), IndexName = rows[i][1].ToString() }; DateTime.TryParse(rows[i][2].ToString(), out DateTime date); decimal.TryParse(rows[i][3].ToString().Replace(",", ""), out decimal open); decimal.TryParse(rows[i][4].ToString().Replace(",", ""), out decimal max); decimal.TryParse(rows[i][5].ToString().Replace(",", ""), out decimal min); decimal.TryParse(rows[i][6].ToString().Replace(",", ""), out decimal close); decimal.TryParse(rows[i][7].ToString().Replace(",", ""), out decimal markupAmount); decimal.TryParse(rows[i][8].ToString().Replace(",", ""), out decimal markup); decimal.TryParse(rows[i][9].ToString().Replace(",", ""), out decimal vol); decimal.TryParse(rows[i][10].ToString().Replace(",", ""), out decimal amount); quotation.Date = date; quotation.Open = open; quotation.Max = max; quotation.Min = min; quotation.Close = close; quotation.MarkupAmount = markupAmount; quotation.Markup = markup; quotation.Volume = vol; quotation.Amount = amount; quotations.Add(quotation); } DataDao.UpdateIndexQuotations(quotations); } if (version == null) { DataDao.AddFileVersion(new FileVersion { LastAccessTime = file.LastAccessTime, CreationTime = file.CreationTime, FullName = file.FullName, LastWriteTime = file.LastWriteTime }); } else { version.LastWriteTime = file.LastWriteTime; version.LastAccessTime = file.LastAccessTime; DataDao.UpdateFileVersion(version); } } }