Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#解析数据并将其放入正确的数据类型_C#_Regex - Fatal编程技术网

C#解析数据并将其放入正确的数据类型

C#解析数据并将其放入正确的数据类型,c#,regex,C#,Regex,我目前正在尝试从一个文件中读取数据,并将数据放入数据的正确位置。然而,我发现在C语言中解析字符串比C++更困难。我正在阅读的文件中的一个示例如下: CGI控股公司厚度2.15 0.01 0.47-64.17 6.25 1.92 23.78 转换为以下数据类型 public class StockInfo { public string Company { get; set; } public string TickerSymbol { get; set;

我目前正在尝试从一个文件中读取数据,并将数据放入数据的正确位置。然而,我发现在C语言中解析字符串比C++更困难。我正在阅读的文件中的一个示例如下:

CGI控股公司厚度2.15 0.01 0.47-64.17 6.25 1.92 23.78

转换为以下数据类型

public class StockInfo
    {
        public string Company { get; set; }
        public string TickerSymbol { get; set; }
        public decimal CurrentPrice { get; set; }
        public decimal PriceChange { get; set; }
        public decimal PercentChange { get; set; }
        public decimal YTDChange { get; set; }
        public decimal FiftyTwoWeekHigh { get; set; }
        public decimal FiftyTwoWeekLow { get; set; }
        public decimal PE_Ratio { get; set; }
    }
因此,该公司将=“CGI控股公司”

股票代码=“厚度”

当前价格=2.15等

但是,我不知道如何正确解析数据。我曾尝试使用正则表达式,但名称中可能包含不同数量的单词,需要从代码中对其进行分类

Ex:CHICAGO MERCANTILE Ex HD CME 301.13 23.53 8.48 31.67 315.00 132.57 35.73


任何能为我指明正确方向的想法都将不胜感激

我为您创建了一个简单的程序,这可能不是最好的方式,但我认为它会带您到达目的地

  string input = "CGI HOLDING CORP THK 2.15 0.01 0.47 -64.17 6.25 1.92 23.78";
  List<string> inputSplit = input.Split(' ').ToList();

  PE_Ratio = Convert.ToDecimal(inputSplit[inputSplit.Count-1]);
  FiftyTwoWeekLow = Convert.ToDecimal(inputSplit[inputSplit.Count - 2]);
  FiftyTwoWeekHigh = Convert.ToDecimal(inputSplit[inputSplit.Count - 3]);
  YTDChange = Convert.ToDecimal(inputSplit[inputSplit.Count - 4]);
  PercentChange = Convert.ToDecimal(inputSplit[inputSplit.Count - 5]);
  PriceChange = Convert.ToDecimal(inputSplit[inputSplit.Count - 6]);
  CurrentPrice = Convert.ToDecimal(inputSplit[inputSplit.Count - 7]);
  TickerSymbol = inputSplit[inputSplit.Count - 8];

  for (int i = 0; i < inputSplit.Count - 8; i++)
  {
    Company = Company + (inputSplit[i] + " ");
  }

  Company = Company.Trim();
string input=“CGI控股公司厚度2.15 0.01 0.47-64.17 6.25 1.92 23.78”;
List inputSplit=input.Split(“”).ToList();
PE_比率=转换为小数(inputSplit[inputSplit.Count-1]);
FiftyTwoWeekLow=Convert.ToDecimal(inputSplit[inputSplit.Count-2]);
FiftyTwoWeekHigh=Convert.ToDecimal(inputSplit[inputSplit.Count-3]);
YTDChange=Convert.ToDecimal(inputSplit[inputSplit.Count-4]);
PercentChange=Convert.ToDecimal(inputSplit[inputSplit.Count-5]);
PriceChange=Convert.ToDecimal(inputSplit[inputSplit.Count-6]);
CurrentPrice=Convert.ToDecimal(inputSplit[inputSplit.Count-7]);
TickerSymbol=inputSplit[inputSplit.Count-8];
对于(int i=0;i
如果您想使用正则表达式,可以使用:

(.+)(\w{3})((?:\s\-?\d{1,3}\.\d{2}){7})
这将匹配并分组两个示例。公司名称将有一个尾随空格,“数字组”将有一个前导空格,但在代码中消除这一点应该不是问题

说明,从右到左:

((?:\s\-?\d{1,3}\.\d{2}){7})
匹配七次(非捕获)组
(?:\s \-?\d{1,3}.\d{2})
,然后依次匹配:一个空格(
\s
)后跟一个可选破折号(
\-?
),后跟一到三个数字(
\d{1,3}
),后跟一个点(
\
),后跟两个数字(
\d{2})。这与输入末尾的七个数字相匹配

(\w{3})
匹配三个字符的“股票代码”

(.+)

匹配所有其他字符:示例中的公司名称。

是否可以用逗号(,)或其他字符分隔每个值?不,它们是原样。否则,我可以只拆分逗号(,)上的字符串。我认为从右到左读取正则表达式可能是我最好的选择。如果要解析的字段数是固定的,并且输入中没有可选字段,则可以从字符串末尾向后传递。解析7位小数后,下一位是ticker symbol,其余的是name。ticker symbol“THK”是静态单词吗?这里的空格不是分隔符吗?