2016-05-13 9 views
0

大きな固定幅のテキストファイルがあり、行ごとに読み込んでデータテーブルに挿入するか、データテーブルに読み込む必要があります。 1つの列がどの位置に配置されるのかをどのように割り当てることができますか?固定幅テキストファイルを行ごとにdatatable行に読み込み - C#

また、レコードごとに余分なスペースを取り除くなどのアクションを実行する必要があります。

私はこのコードを試みたが、それは代わりに15

string sourcePath = @"c:\\"; 
string filename = "file.txt"; 

DataTable dt; 

//Create OleDb connection object 
using (OleDbConnection cn = new OleDbConnection(@"Provider=Microsoft.Jet.OleDb.4.0;" + 
      "Data Source=" + sourcePath + ";Extended Properties=\"Text;\"")) 
{ 
    // Open connection 
    cn.Open(); 

    // Create OleDb Adapter object 
    using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + filename, cn)) 
    { 
     dt = new DataTable("Records"); 
     adapter.Fill(dt); 

     // Display results 
     dataGridView1.DataSource = dt; 
    } 
} 

サンプルデータ

サンプル名.......〜住所〜市〜州〜12345のわずか3列の私はDataTableを提供しますお問い合わせ先123-456-7890お支払方法 サンプル名.......〜住所〜市〜州〜12345お問い合わせ先123-456-7890お支払い方法 サンプル名.......〜住所市町村〜州〜12345お問い合わせ先123-456-7890お支払い方法 サンプル名.......〜住所都市〜州〜12345お問い合わせ先123-456-7890種類のお支払い

..

+0

これまでに何を試みましたか?あなたの入力ファイルのフォーマット/構造は何ですか? – techspider

+0

OleDbを試してみましたが、ファイルが固定幅のテキストファイル –

+0

データファイルのサンプル行を投稿してください – techspider

答えて

0

の間で多くのスペースを使用すると、OLEDBテキストドライバを使用して、テキストファイルを読みたい場合は、のいずれかの構造を記述Schema.iniファイルを提供する必要がありますテキストファイルの「記録」(ライン)

だから、あなたのテキストファイルは、この形式のレコードが含まれていることを仮定:あなたが追加する必要が

XXXXXYYYYYKKKKKZZZZ 

(四つのフィールド、5文字のそれぞれ)あなたのテキストが置かれている同じフォルダあなたはNET Frameworkですでに利用可能なものを使用するか、または独自に記述する必要がOLEDBを使用せずに

の上にリンクされMSDNのページで詳細を見つけることができる

[file.txt] 
Format=FixedLength 
Col1=CustomerNumber Text Width 5 
Col2=CustomerName Text Width 5 
Col3=CustomerCity Text Width 5 
Col4=CustomerZIP Text Width 5 

この構造でSchema.iniファイルを提出コードを分割する、またはサードパーティのライブラリを使用する

独自のコードアプローチでは、レコードのクラスを定義し始めます。
例えば、Customerクラスは、あなたがList<Customer>を定義し、あなたのデータで埋めあなたのリストを持っているループの最後で

List<Customer> customers = new List<Customer>(); 
foreach(string line in File.ReadLines(filename) 
{ 
    Customer c = new Customer(); 
    c.Name = line.Substring(0, 10).Trim(); 
    c.Address = line.Substring(10, 15).Trim(); 
    ... and so on for all the other fields.... 

    customers.Add(c);   
} 

を使用してファイルの読み込みを開始

public class Customer 
{ 
    public string Name {get;set;} 
    public string Address {get;set;} 
    ... other fields omitted .... 
} 

である可能性があります。もちろん、データベースサーバー上の別のテーブルにすべてを書き込むだけであれば、データベーステーブルをループ内に直接挿入/更新するコードを記述して、リストのロードを避けることができます。

+0

ファイル名をハードコードしたくない場合は、動的です。 –

+0

2つのオプションがあります。実行時にSchema.iniを作成するか、テキストファイルを読み込むコードを作成し、部分文字列に従って各行を分割します。 – Steve

+0

私はこの目的のためにファイルヘルパーを探っています –

関連する問題