c# - 如何正确解析由空格分隔的文本文件

标签 c# odbc text-files text-driver

下面是我的示例文本文件

enter image description here {

这是我的架构文件

[Sample File.txt]
ColNameHeader=True
Format=TabDelimited
CharacterSet=ANSI

这里是我目前为尝试读取上述示例文件而编写的代码,从上述文本文件读取的数据行应该返回以在 dataGridView 控件中显示。问题是,它作为单列返回,但我想使用这些空格作为列分隔符。我尝试了不同的字符定界符,但都没有成功。

public DataSet LoadCSV(int numberOfRows)
    {
        DataSet ds = new DataSet();
            // Creates and opens an ODBC connection
            string strConnString = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" + this.dirCSV.Trim() + ";Extensions=asc,csv,tab,txt;Persist Security Info=False";

            string sql_select;
            OdbcConnection conn;
            conn = new OdbcConnection(strConnString.Trim());
            conn.Open();

            //Creates the select command text
            if (numberOfRows == -1)
            {
                sql_select = "select * from [" + this.FileNevCSV.Trim() + "]";
            }
            else
            {
                sql_select = "select top " + numberOfRows + " * from [" + this.FileNevCSV.Trim() + "]";
            }

            //Creates the data adapter
            OdbcDataAdapter obj_oledb_da = new OdbcDataAdapter(sql_select, conn);

            //Fills dataset with the records from CSV file
            obj_oledb_da.Fill(ds, "csv");

            //closes the connection
            conn.Close();

        return ds;
    }

并将dataGridView的数据源设置为

    // loads the first 500 rows from CSV file
this.dataGridView_preView.DataSource = LoadCSV(500);
this.dataGridView_preView.DataMember = "csv";

我,在 datagridview 中得到这个,我得到一列,但我希望看到返回的数据为 7 列。

另外,我不知道 F2 和 F3 列来自哪里

enter image description here

最佳答案

我可能会用不同的方式来做这件事。我会使用 StreamReader,逐行读取文件,将字符串分解为对象属性,然后将对象存储在列表中。然后将列表绑定(bind)到 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);
    }

Screenshot

关于c# - 如何正确解析由空格分隔的文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11720787/

相关文章:

c# - 我怎样才能将地址​​解析成它的各个组成部分?

c# - UserManager.AddToRole 不工作 - 外键错误

cocoa - 在 Cocoa 中将核心数据实体导出为文本文件

sql-server - 连接到 SQL Server(从 Ubuntu): [RubyODBC] Cannot allocate SQLHENV

php - 如何查询列名中带句点的Excel工作表

arrays - bash:将大括号处的文本文件拆分为数组

c++ - 在 native Windows 应用程序的资源中嵌入文本文件

c# - 下料问题

c# - 如何从代码中设置 MQQueueManager 的 CCSID?

sql - 将 XCODE 开发连接到 SQL Azure 数据库需要什么?