2011-01-26 4 views
0

Я хотел бы сделать приложение Windows Forms, которое будет читаться в текстовом файле и помещать поля текстового файла в текстовые поля.Как разобрать текстовый файл с помощью C#?

Пример формата текстового файла:

Name;Surname;Birthday;Address 

Name;Surname;Birthday;Address 

Winforms

Name: textboxname 

Surname: textboxsurname 

Birthday: textboxbirth 

Address: textboxaddress 

Я также хочу, чтобы это приложение Winforms иметь кнопку Next и Back поэтому он может цикл через записи.

Я не знаю, как это сделать на C#. С чего начать?

+3

Взгляните на это: http://stackoverflow.com/questions/1375410/very-simple-c-csv-reader –

+0

ок я думаю будет правильным :-) 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' вы можете использовать' File.ReadLines', который читает строки один за другим. –

+0

@ Danko: Ницца. Это дает лучшее из обоих миров. 'File.ReadLines' также доступен на .NET 3.5. – Brian

0

В основном вы должны

  • Прочитайте файл (File.ReadAllLines)
  • Создать список записей (1 запись = 1 комплект имя, фамилия, дата рождения)
  • PARSE текст для чтения и заполнить список с записями
  • создать форму и передавать полученные данные в этой форме
  • Создайте свой собственный UserControl = набор текстовых полей для просмотра данных + несколько кнопок (FW и BW)

Это довольно сложный вопрос.

2

Вот простой пример, который показывает, как разбирать CSV-файл с помощью VB.NET TextFieldParser. Почему TextFieldParser? Потому что это самый полный синтаксический анализатор CSV, и он уже установлен в .NET.

Он также показывает, как привязка данных работает в Windows Forms. Прочтите документацию для получения дополнительной информации, это только для того, чтобы вы начали.

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; 
    } 
} 
Смежные вопросы