2015-02-11 52 views
0

我正在尝试从文件读入并将数据放入数据中的正确位置。不过,我发现在C#中解析字符串比C++困难得多。从我读在文件中的一个例子如下:C#解析数据并将其输入正确的数据类型

CGI HOLDING CORP THK 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 HOLDING CORP”

股票代号= “THK”

当前价格= 2.15等等

但是我不知道如何正确解析数据。我尝试过使用正则表达式,但名称中可能有不同数量的单词,需要从代号中分出。

例如:芝加哥商业EX HD CME 301.13 23.53 8.48 31.67 315.00 132.57 35.73

可以点我在正确的方向上没有任何想法,将不胜感激

+0

是否可以用逗号(,)或其他字符分隔每个值? – 2015-02-11 10:22:01

+0

不,他们是不幸的。否则,我可以用逗号(,)分割字符串。我想从右到左阅读正则表达式可能是我最好的选择。 – Derked 2015-02-11 10:25:58

+0

如果要解析的字段数量是固定的,并且输入中没有可选字段,则可以从字符串末尾向后传递。解析7位小数后,下一个是ticker symbol,剩下的就是名字 – 2015-02-11 10:26:12

回答

1

我已经创建了一个简单的程序,对你来说,它可能不是最好的方式,但我认为它会把你带到你的目的地。

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(); 
1

如果你想出去一个正则表达式,你可以使用:

(.+)(\w{3})((?:\s\-?\d{1,3}\.\d{2}){7}) 

此相匹配,并且组的两个例子。公司名称将有一个尾随空白,以及“号码组”将有一个主要的空白,但这不应该是一个问题,以消除你的代码。

regex101 Demo

说明,从右到左:

((?:\s\-?\d{1,3}\.\d{2}){7}) 

匹配七次(非捕获)基团(?:\s\-?\d{1,3}\.\d{2})而这又对相符:接着任选的一个空格(\s)破折号(\-?),后面是一到三个数字(\d{1,3}),后面跟着一个点(\.),后跟两个数字(\d{2})。所以这与你输入结尾的七个数字相匹配。

(\w{3}) 

匹配三个字符的“股票代码”。

(.+) 

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