我可能会用不同的方式来做这件事。我将使用 StreamReader,逐行读取文件,将字符串分解为对象属性,并将对象存储在列表中。然后将该列表绑定到 datagridviews 数据源。我演示了两种快速方法来做到这一点。
1 - 制表符分隔的数据
如果文件是制表符分隔的(看起来如此),则将该行拆分为一个数组,并将每个索引分配给一个属性,如下所示。
public partial class Form1 : Form
{
private void Form1_Load(object sender, EventArgs e)
{
var rows = new List<Row>();
var sr = new StreamReader(@"C:\so_test.txt");
while (!sr.EndOfStream)
{
string s = sr.ReadLine();
if (!String.IsNullOrEmpty(s.Trim()))
{
rows.Add(new Row(s));
}
}
sr.Close();
dataGridView1.DataSource = rows;
}
}
public class Row
{
public double Number1 { get; set; }
public double Number2 { get; set; }
public double Number3 { get; set; }
public double Number4 { get; set; }
public double Number5 { get; set; }
public double Number6 { get; set; }
public double Number7 { get; set; }
public string Date1 { get; set; }
public Row(string str)
{
string[] separator = { "\t" };
var arr = str.Split(separator, StringSplitOptions.None);
Number1 = Convert.ToDouble(arr[0]);
Number2 = Convert.ToDouble(arr[1]);
Number3 = Convert.ToDouble(arr[2]);
Number4 = Convert.ToDouble(arr[3]);
Number5 = Convert.ToDouble(arr[4]);
Number6 = Convert.ToDouble(arr[5]);
Number7 = Convert.ToDouble(arr[6]);
Date1 = arr[7];
}
}
2 - 硬起点和长度
如果数据以制表符分隔,但符合每列的严格起点和终点,则可以将每列的起点和长度声明为常量,并通过子字符串获取它们。只需要更改 Row 类中的代码即可,如下所示。为了简洁起见,我保留了一些常量,只是对它们进行了硬编码。
public Row(string str)
{
Number1 = Convert.ToDouble(str.Substring(4, 6));
Number2 = Convert.ToDouble(str.Substring(16, 6));
Number3 = Convert.ToDouble(str.Substring(28, 7));
Number4 = Convert.ToDouble(str.Substring(40, 7));
Number5 = Convert.ToDouble(str.Substring(52, 6));
Number6 = Convert.ToDouble(str.Substring(64, 6));
Number7 = Convert.ToDouble(str.Substring(76, 6));
Date1 = str.Substring(88, 24);
}