2014-12-22 66 views
2

所以我嘗試了一些研究,但我只是不知道如何google一下..C# - 讀一個複雜的文件轉換成一個ComboBox

例如,我有一個.db的(作品一樣爲.TXT我)文件,這樣寫的:

DIRT: 3; 
STONE: 6; 

到目前爲止,我有一個代碼,可以把物品在這樣的組合框:

DIRT, 
STONE, 

會把灰塵和石頭的組合框。這是我正在使用的代碼:

 string[] lineOfContents = System.IO.File.ReadAllLines(dbfile); 
     foreach (var line in lineOfContents) 
     { 
      string[] tokens = line.Split(','); 
      comboBox1.Items.Add(tokens[0]); 
     } 

如何擴展此以便它將例如DIRT和STONE在組合框中,並將其餘(3)保留在變量中(int,如int varDIRT = 3)? 如果你想,它不一定是txt或db文件..我聽說xml也是配置文件。

+0

嘗試創建一個類來保存該信息。拆分逗號是沒有意義的,因爲在您的示例數據中,您沒有顯示任何逗號。你的意思是:冒號? – LarsTech

+0

'ComboBox'有兩個屬性可以使用。一個是「ValueMember」,另一個是「DisplayMember」。例如,你可以將你的數據庫文件讀入一個包含兩列,'element'和'value'等的表格。然後將'ValueMember'設置爲'value'並將'DisplayMember'設置爲'element'。當然,您還必須確保將「ComboBox」的數據源設置爲包含您的數據的表格。 –

+0

@LarsTech在我之前的DB文件中,我有逗號,那就是爲什麼它仍然存在。對於新的,我必須使用分號。這讓我想到了一個想法:如果我在雙點上有線問題,我還能讀出線的其餘部分嗎? – devRicher

回答

2

試着做這樣的事情:

  cmb.DataSource = File.ReadAllLines("filePath").Select(d => new 
      { 
       Name = d.Split(',').First(), 
       Value = Convert.ToInt32(d.Split(',').Last().Replace(";","")) 
      }).ToList(); 
      cmb.DisplayMember = "Name"; 
      cmb.ValueMember= "Value"; 

記住它需要使用using System.Linq; 如果您想OT引用組合框的設定值,你可以使用 cmb.SelectedValue; cmb.SelectedText;

+0

我得到一個錯誤... Forms.ComboBox不包含'DataMember'的定義,也沒有擴展方法'DataMember'等等。價值相同。 – devRicher

+0

錯誤代碼,但已更正嘗試 – Patrick

+0

OP發佈的示例數據不是用逗號分隔的。你會想要使用':'進行分割並刪除';'在轉換值之前。 – jbriggs

0

你也可以使用FileHelpers庫。首先定義你的數據記錄。

[DelimitedRecord(":")] 
public class Record 
{ 
    public string Name; 
    [FieldTrim(TrimMode.Right,';')] 
    public int Value;  
} 

然後你在你的數據像這樣寫着:

FileHelperEngine engine = new FileHelperEngine(typeof(Record)); 
//Read from file 
Record[] res = engine.ReadFile("FileIn.txt") as Record[]; 

// write to file 
engine.WriteFile("FileOut.txt", res); 
1

我覺得你真的有兩個問題,所以我會盡力單獨回答。

的第一個問題是「我怎樣才能解析看起來像這樣一個文件...

DIRT: 3; 
STONE: 6; 

爲名稱和整數?」您可以從每行刪除所有空白和分號,然後拆分冒號。一個清潔的方式,在我看來,是使用正則表達式:

// load your file 
var fileLines = new[] 
{ 
    "DIRT: 3;", 
    "STONE: 6;" 
}; 

// This regular expression will match anything that 
// begins with some letters, then has a colon followed 
// by optional whitespace ending in a number and a semicolon. 
var regex = new Regex(@"(\w+):\s*([0-9])+;", RegexOptions.Compiled); 
foreach (var line in fileLines) 
{ 
    // Puts the tokens into an array. 
    // The zeroth token will be the entire matching string. 
    // Further tokens will be the contents of the parentheses in the expression. 
    var tokens = regex.Match(line).Groups; 
    // This is the name from the line, i.e "DIRT" or "STONE" 
    var name = tokens[1].Value; 
    // This is the numerical value from the same line. 
    var value = int.Parse(tokens[2].Value); 
} 

如果你不熟悉正則表達式,我建議你檢查出來;他們可以很容易地格式化字符串並提取值。 http://regexone.com/

第二個問題,「我如何將價值與名稱一起存儲?」,我不確定自己完全理解。如果你想要做的是用文件中指定的數值返回每個項目,那麼的建議對你有好處。您需要將名稱作爲顯示成員,作爲值成員。但是,由於您的數據不在表格中,因此您必須將數據放置在可訪問的位置,以便您可以對要使用的屬性進行命名。我推薦一本字典:

 // This is your ComboBox. 
     var comboBox = new ComboBox(); 

     // load your file 
     var fileLines = new[] 
     { 
      "DIRT: 3;", 
      "STONE: 6;" 
     }; 

     // This regular expression will match anything that 
     // begins with some letters, then has a colon followed 
     // by optional whitespace ending in a number and a semicolon. 
     var regex = new Regex(@"(\w+):\s*([0-9])+;", RegexOptions.Compiled); 

     // This does the same as the foreach loop did, but it puts the results into a dictionary. 
     var dictionary = fileLines.Select(line => regex.Match(line).Groups) 
      .ToDictionary(tokens => tokens[1].Value, tokens => int.Parse(tokens[2].Value)); 

     // When you enumerate a dictionary, you get the entries as KeyValuePair objects. 
     foreach (var kvp in dictionary) comboBox.Items.Add(kvp); 

     // DisplayMember and ValueMember need to be set to 
     // the names of usable properties on the item type. 
     // KeyValue pair has "Key" and "Value" properties. 
     comboBox.DisplayMember = "Key"; 
     comboBox.ValueMember = "Value"; 

在這個版本中,我用Linq來構造字典。如果您不喜歡Linq語法,則可以使用循環代替:

var dictionary = new Dictionary<string, int>(); 
foreach (var line in fileLines) 
{ 
    var tokens = regex.Match(line).Groups; 
    dictionary.Add(tokens[1].Value, int.Parse(tokens[2].Value)); 
} 
+0

中使用「:」整齊,但對於「第一個問題」,在分割後如何讀取文件的其餘部分? – devRicher

+0

@devRicher我寫它的方式是一行一行地工作,所以你仍然必須按照原來的方式來執行ReadAllLines,以便在我的示例中獲取行到fileLines數組中。 – JwameeQohwiye

+0

@devRicher如果你想讓你的文件包含其他不在DIRT中的東西:3;格式,那麼你需要使用正則表達式來測試行*是否匹配。如果是,那麼你可以像我一樣使用解析的令牌。如果不是,你會做別的。 – JwameeQohwiye

相關問題