Visual C#2005――如何解析含有多种格式的文本文件

一般而言,文本文件都只 包含一 格式(例如,以逗 分隔或是 固定字段 ),然而文本文件却很可能含有多 格式, 遇到此 种状况时该 如何 理呢?
 
 
如果 的文本文件含有多 格式, 应该 使用 TextFieldParser 象的 PeekChars 方法去取得 据行 从头 算起特定 目的字符,以便藉此 断该数 据行的格式,然后告知 TextFieldParser 该数 据行的格式 并读 该数 据行。 PeekChars 方法只 返回指定 目的字符而且不 至下一行,通 过这样 逐一判 每一 笔数 据行的格式 逐行 据行的方式,即可 解析含有多 格式的文字文件 并顺 取。
 
来说 ,假 用程序 目的 Text 文件 含有一 称为 “多格式文本文件 .txt ”的文本文件,此文本文件的特殊之 在于 含有下列三 格式:
 
Ø        固定字段 度分 别为 5 10 -1 据行。
Ø        固定字段 度分 别为 6 10 17 -1 据行。
Ø        采用逗 分隔的 据行。
 
上述 格式的 据行存在一 特点,就是 据行的 开头 字符分 CK PB SP ,因此我 只要通 TextFieldParser 象的 PeekChars 方法取得 据行的前 两个 字符,然后根据其 值来设 TextFieldType 性,以及 Delimiters 性(或 SetDelimiters 方法)或 FieldWidths 性(或 SetFieldWidths 方法), 使用 ReadFields 方法 来读 据行。反 使用此方式 来处 理每一 笔数 据行,就能 够顺 利解析 并读 取整 文本文件。
 
以下的程序代 示范如何 “多格式文本文件 .txt ”中的三 格式 据解析出 来并 别显 示于各自的 DataGridView 控件中。相 程序代 列示如下:
 
private void CH1_DemoForm035_Load(object sender, EventArgs e)
  {
      txtResult.Text = File.ReadAllText(@"Text\ 多格式文本文件 .txt" );

      DataGridView1.ColumnHeadersVisible = true;

      // 设定栏标题样式。
      DataGridViewCellStyle columnHeaderStyle = new DataGridViewCellStyle();

      columnHeaderStyle.BackColor = Color.Beige;
      columnHeaderStyle.Font = new Font("Verdana", 9, FontStyle.Bold);
      DataGridView1.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

      // 设定 DataGridView 控件的数据行数目。
      DataGridView1.ColumnCount = 3;

      // 设定各数据行的标题名称。
      DataGridView1.Columns[0].Name = " 类别编号 " ;
      DataGridView1.Columns[1].Name = " 类别名称 " ;
      DataGridView1.Columns[2].Name = " 说明 " ;

      DataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

      DataGridView2.ColumnHeadersVisible = true;
      DataGridView2.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

      // 设定 DataGridView 控件的数据行数目。
      DataGridView2.ColumnCount = 4;

      // 设定各数据行的标题名称。
      DataGridView2.Columns[0].Name = " 产品编号 " ;
      DataGridView2.Columns[1].Name = " 产品名称 " ;
      DataGridView2.Columns[2].Name = " 单位数量 " ;
      DataGridView2.Columns[3].Name = " 单价 " ;

      DataGridView2.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

      DataGridView3.ColumnHeadersVisible = true;
      DataGridView3.ColumnHeadersDefaultCellStyle = columnHeaderStyle;

      // 设定 DataGridView 控件的数据行数目。
      DataGridView3.ColumnCount = 3;
 
      // 设定各数据行的标题名称。
      DataGridView3.Columns[0].Name = " 货运公司编号 " ;
      DataGridView3.Columns[1].Name = " 货运公司名称 " ;
      DataGridView3.Columns[2].Name = " 电话 " ;

      DataGridView3.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

  }

  private void btnParseTextFiles_Click(object sender, EventArgs e)
  {
      using (TextFieldParser myReader =
                      new TextFieldParser(@"Text\ 多格式文本文件 .txt" ))
      {
          // 定义三种格式之各栏的宽度与分隔字符。
          int[] FirstFormat = { 5, 10, -1 };
          int[] SecondFormat = { 6, 10, 17, -1 };
          string[] ThirdFormat = { "," };

          this.DataGridView1.Rows.Clear();
          this.DataGridView2.Rows.Clear();
          this.DataGridView3.Rows.Clear();

          string[] CurrentRow;

          while (!myReader.EndOfData)
          {
              try
              {
                  string RowType = myReader.PeekChars(2);

                  switch (RowType)
                  {
                      case "CK":
                          myReader.TextFieldType = FieldType.FixedWidth;
                          myReader.FieldWidths = FirstFormat;
                          // 或是 myReader.SetFieldWidths(FirstFormat);
                          CurrentRow = myReader.ReadFields();
                          this.DataGridView1.Rows.Add(CurrentRow);
                          break;
                      case "PB":
                          myReader.TextFieldType = FieldType.FixedWidth;
                          myReader.FieldWidths = SecondFormat;
                          // 或是 myReader.SetFieldWidths(SecondFormat);
                          CurrentRow = myReader.ReadFields();
                          this.DataGridView2.Rows.Add(CurrentRow);
                          break;
                      case "SP":
                          myReader.TextFieldType = FieldType.Delimited;
                          myReader.Delimiters = ThirdFormat;
                          // 或是 myReader.SetDelimiters(ThirdFormat);
                          CurrentRow = myReader.ReadFields();
                          this.DataGridView3.Rows.Add(CurrentRow);
                          break;
                  }
              }
              catch (MalformedLineException ex)
              {
                  MessageBox.Show(" " + ex.Message + " 是无效的。略过。 " );
              }
          }

          // 排序各个 DataGridView 控件的内容。
          DataGridView1.Sort(DataGridView1.Columns[0],
            System.ComponentModel.ListSortDirection.Ascending);
          DataGridView2.Sort(DataGridView2.Columns[0],
            System.ComponentModel.ListSortDirection.Ascending);
          DataGridView3.Sort(DataGridView3.Columns[0],
            System.ComponentModel.ListSortDirection.Ascending);
      }
  }
 
请注意:
在使用 Visual Basic My 对象(或是说 My 快捷方式)之前,必须先在项目中添加对 Microsoft.VisualBasic.dll 的引用,然后如下所示导入适当的命名空间:
 
using Microsoft.VisualBasic.Devices;
 
如此一来,就可以在 Visual C# 中使用与 My 相似的语法来撰写程序。

本文出自 “章立民” 博客,转载请与作者联系!

你可能感兴趣的:(职场,C#,文本文件,休闲,Visual)