2015-02-11 11 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}) 

匹配三個字符的「股票代碼」。

(.+) 

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