2017-05-09 8 views
0

データテーブルからSQLテーブルに値を挿入していますが、「データ型エラーの変換」が表示されています。私のソースファイルは固定幅で、これらの値を取得するために部分文字列を使用しています。データテーブルからSQLテーブルに文字列データ型をdecimalとintにキャストする方法

Source: 

    Amount  Name  Id   Date 
    -33,167.74 NHP  1,503   05/09/2017 

これは私のターゲット表がカラムとデータ型

id int 
name string 
amount money 
date datetime 

の下に、私はすべてのデータの変換エラーを取得していたデータテーブルに

private DataTable InsertDataTable() 
{ 
    DataTable datatable = new DataTable(); 
    datatable.Columns.Add("Id", typeof(int)); 
    datatable.Columns.Add("amount", typeof(decimal)); 
    datatable.Columns.Add("name", typeof(string)); 
    datatable.Columns.Add("date", typeof(datetime)); 

    //--inserting datatable 

    foreach (string row in columns) 
    { 
     datarow["Id"] = Convert.ToInt32(row.Substring(51, 12).Trim().Replace(",", "")); 
     datarow["Amount"] = Convert.ToDecimal(row.Substring(0, 9).Trim()); 
     datarow["date"] = Convert.ToDateTime(row.Substring(12, 18).Trim()); 
     datarow["name"] = Convert.ToDecimal(row.Substring(20, 35).Trim()); 
     datatable.Rows.Add(datarow); 
    } 
} 

private void InsertSqlTable() 
{ 
    DataTable finaldatatable = InsertDataTable(); 
    //sql connection-------------------- 
    using (SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(con)) 
    { 
     //Set the database table name 
     sqlBulkCopy.DestinationTableName = "[dbo].[table]"; 
     sqlBulkCopy.ColumnMappings.Add("id", "id"); 
     sqlBulkCopy.ColumnMappings.Add("amount", "amount"); 
     sqlBulkCopy.ColumnMappings.Add("name", "name"); 
     sqlBulkCopy.ColumnMappings.Add("date", "date"); 
    } 
} 

を使用してSQLテーブルを挿入するための私のコードです文字列を除く型。私のIDは1,503で1503が欲しいです。 誰かが正しいデータ型に変換するのを助け、IDからカンマも削除できますか? ご迷惑をおかけして申し訳ございません。

+0

私が正しくカウントしていた場合、その量は右、位置0から10個の文字を持っていますか?これらの部分文字列の位置はすべてオフになっていますか? –

+0

これはデータを模倣しているので、私の部分文字列の値は異なります。まず、データテーブルの任意の値からカンマを削除する方法を知りたい。 – chits

+0

C#でお手伝いできない場合は、他の人があなたを案内する必要があります。しかし、これは "-33,167.74"に10文字が含まれ、部分文字列の長さが9にすぎないという事実を変更しません。 –

答えて

0

Regexを使用して希望の出力を得ることができます。私はすべてのデータがサンプルデータのように書式設定されていると考えています。

まず、Regexを使用してId, Amount & dateを取得しました。その後、私はnameとなります。

正規表現:

((-|)\b\d[\d,.\/]*\b) 

Regex101 Example

例C#コード:

using System; 
using System.Text.RegularExpressions; 

public class Program 
{ 
    public static void Main() 
    { 
     string data = "-33,167.74 NHP  1,503   05/09/2017"; 

     string regex = @"((-|)\b\d[\d,.\/]*\b)"; 
     var matches = Regex.Matches(data, regex, RegexOptions.Multiline); 

     int Id = Convert.ToInt16(matches[1].Groups[0].ToString().Replace(",", "")); 
     decimal Amount = Convert.ToDecimal(matches[0].Groups[0].ToString()); 
     DateTime date = Convert.ToDateTime(matches[2].Groups[0].ToString()); 
     string name = Regex.Replace(data, regex, "").ToString().Trim(); 

     Console.WriteLine("Id: " + Id); 
     Console.WriteLine("Amount: " + Amount); 
     Console.WriteLine("date: " + date); 
     Console.WriteLine("name: " + name); 
    } 
} 
Output of example in DotNetFiddle

あなたのコード内の文の下に変更してください:

foreach (string row in columns) 
{ 
    string data = row; 

    string regex = @"((-|)\b\d[\d,.\/]*\b)"; 
    var matches = Regex.Matches(data, regex, RegexOptions.Multiline); 

    int Id = Convert.ToInt16(matches[1].Groups[0].ToString().Replace(",", "")); 
    decimal Amount = Convert.ToDecimal(matches[0].Groups[0].ToString()); 
    DateTime date = Convert.ToDateTime(matches[2].Groups[0].ToString()); 
    string name = Regex.Replace(data, regex, "").ToString().Trim(); 

    datarow["Id"] = Id; 
    datarow["Amount"] = Amount; 
    datarow["date"] = date; 
    datarow["name"] = name; 
    datatable.Rows.Add(datarow); 
} 
関連する問題