2011-01-26 18 views
0

テキストファイルを読み込んでテキストファイルのフィールドをテキストボックスに入れるWindowsフォームアプリケーションを作成したいと思います。テキストファイル形式のC#を使用してテキストファイルを解析するにはどうすればよいですか?

例:

Name;Surname;Birthday;Address 

Name;Surname;Birthday;Address 

Winformsの

Name: textboxname 

Surname: textboxsurname 

Birthday: textboxbirth 

Address: textboxaddress 

私もそれがレコードをサイクルをすることができますので、これのWinformsアプリケーションはNextBackボタンを持っていると思います。

私はC#でこれを行う方法がわかりません。どこから始めますか?シンプルな形では

+3

はこれを見てください:http://stackoverflow.com/questions/1375410/very-simple-c-csv-reader –

+0

[OK]を私は、右のいずれか:-) THX – Sebastian

答えて

2

、あなたが行毎にファイルを読んで、;上の各ラインを分割した値を使用しては:

// open the file in a way so that we can read it line by line 
using (Stream fileStream = File.Open("path-to-file", FileMode.Open)) 
using (StreamReader reader = new StreamReader(fileStream)) 
{ 
    string line = null; 
    do 
    { 
     // get the next line from the file 
     line = reader.ReadLine(); 
     if (line == null) 
     { 
      // there are no more lines; break out of the loop 
      break; 
     } 

     // split the line on each semicolon character 
     string[] parts = line.Split(';'); 
     // now the array contains values as such: 
     // "Name" in parts[0] 
     // "Surname" in parts[1] 
     // "Birthday" in parts[2] 
     // "Address" in parts[3] 

    } while (true); 
} 

また、これらのようなファイルの取り扱いを容易ライブラリであるCSVReaderをチェックしてください。

+0

素敵な答えだと思う厥.. .thx私はそれを試みるが、私はどのように次と戻るボタンを作ることができますか? – Sebastian

+0

@matthias:別の質問をしたいと思うでしょう。しかし、代わりに基本的なC#Webformsチュートリアルを見つけることをお勧めします。 – Brian

5
foreach (string line in File.ReadAllLines("path-to-file")) 
{ 
    string[] data = line.Split(';'); 
    // "Name" in data[0] 
    // "Surname" in data[1] 
    // "Birthday" in data[2] 
    // "Address" in data[3] 
} 

これはフレドリックのコードよりもはるかに単純ですが、ファイルを一度に読み込みます。これは通常は問題ありませんが、非常に大きなファイルには問題が発生します。

+2

.NET 4では、 'File.ReadAllLines'の代わりに、行を1つずつ読み込む' File.ReadLines'を使用することができます。 –

+0

@Danko:Nice。それは両方の世界のベストを与える。 'File.ReadLines'は.NET 3.5でも利用可能です。 – Brian

0

基本的にあなたが

  • ファイル(File.ReadAllLines)を読む
  • にレコードのリストを作成しています(名前の1つの記録= 1セット、姓、誕生日)
  • 読み取りテキストを解析し、いくつかのボタン(FWとBWに)+あなたのデータを表示するテキストボックスの独自のユーザーコントロール=セットを作成します
  • を記録
  • でリストを埋めるフォームを作成し、このフォームに取得したデータを渡します

これはかなり複雑な質問です。

2

次は、VB.NET TextFieldParserを使用してCSVファイルを解析する方法を示す簡単な例です。なぜTextFieldParserですか?それはそこで最も完全なCSVパーサーであり、既に.NETにインストールされているからです。

また、Windowsフォームでのデータバインディングのしくみを示しています。詳しくは、ドキュメントをお読みください。

using System; 
using System.Data; 
using System.Drawing; 
using System.Windows.Forms; 
using Microsoft.VisualBasic.FileIO; 

public class Form1 : Form 
{ 
    [STAThread] 
    static void Main() 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 
     Application.Run(new Form1()); 
    } 

    DataTable records; 
    BindingSource bindingSource; 

    public Form1() 
    { 
     // Create controls 
     Controls.Add(new Label { Text = "Name", AutoSize = true, Location = new Point(10, 10) }); 
     Controls.Add(new TextBox { Name = "Name", Location = new Point(90, 10) }); 
     Controls.Add(new Label { Text = "Sirname", AutoSize = true, Location = new Point(10, 40) }); 
     Controls.Add(new TextBox { Name = "Sirname", Location = new Point(90, 40) }); 
     Controls.Add(new Label { Text = "Birthday", AutoSize = true, Location = new Point(10, 70) }); 
     Controls.Add(new TextBox { Name = "Birthday", Location = new Point(90, 70) }); 
     Controls.Add(new Label { Text = "Address", AutoSize = true, Location = new Point(10, 100) }); 
     Controls.Add(new TextBox { Name = "Address", Location = new Point(90, 100), Size = new Size(180, 30) }); 
     Controls.Add(new Button { Name = "PrevRecord", Text = "<<", Location = new Point(10, 150) }); 
     Controls.Add(new Button { Name = "NextRecord", Text = ">>", Location = new Point(150, 150) }); 

     // Load data and create binding source 
     records = ReadDataFromFile("Test.csv"); 
     bindingSource = new BindingSource(records, ""); 

     // Bind controls to data 
     Controls["Name"].DataBindings.Add(new Binding("Text", bindingSource, "Name")); 
     Controls["Sirname"].DataBindings.Add(new Binding("Text", bindingSource, "Sirname")); 
     Controls["Birthday"].DataBindings.Add(new Binding("Text", bindingSource, "Birthday")); 
     Controls["Address"].DataBindings.Add(new Binding("Text", bindingSource, "Address")); 

     // Wire button click events 
     Controls["PrevRecord"].Click += (s, e) => bindingSource.Position -= 1; 
     Controls["NextRecord"].Click += (s, e) => bindingSource.Position += 1; 
    } 

    DataTable ReadDataFromFile(string path) 
    { 
     // Create and initialize a data table 
     DataTable table = new DataTable(); 
     table.Columns.Add("Name"); 
     table.Columns.Add("Sirname"); 
     table.Columns.Add("Birthday"); 
     table.Columns.Add("Address"); 

     // Parse CSV into DataTable 
     using (TextFieldParser parser = new TextFieldParser(path) { Delimiters = new String[] { ";" } }) 
     { 
      string[] fields; 
      while ((fields = parser.ReadFields()) != null) 
      { 
       DataRow row = table.NewRow(); 
       for (int n = 0; n < fields.Length; n++) 
        row[n] = fields[n]; 
       table.Rows.Add(row); 
      } 
     } 

     return table; 
    } 
} 
関連する問題