5

以下は私のサンプルテキストファイルです

ここに画像の説明を入力してください {{

これが私のスキーマファイルです

[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でこれを取得します。1つの列を取得しますが、データが7つの列として返されることを期待しています。

さらに、F2列とF3列がどこから来ているのかわかりません

ここに画像の説明を入力してください

4

2 に答える 2

2

私はおそらくこれを別の方法で行うでしょう。StreamReaderを使用して、ファイルを1行ずつ読み取り、文字列をオブジェクトプロパティに分割して、オブジェクトをリストに格納します。次に、リストをdatagridviewsデータソースにバインドします。これを行うための2つの簡単な方法を示します。

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);
    }

スクリーンショット

于 2012-07-30T14:38:13.777 に答える
0

この変更されたschema.iniファイルは問題を解決しているようです。

[Sample File.txt]
Format=FixedLength
Format=TabDelimited
MaxScanRows=25
CharacterSet=ANSI
Col1=Col1 Memo Width 10
Col2=Col2 Memo Width 15
Col3=Col3 Memo Width 11
Col4=Col4 Memo Width 12
Col5=Col5 Memo Width 10
Col6=Col6 Memo Width 11
Col7=Col7 Memo Width 150
于 2012-07-30T12:35:01.757 に答える