2017-08-01 4 views
-2

私は8列のcsvファイルを持っていて、オブジェクトを8変数で設定しようとしています。まず、DataTableに私のcsvデータを入力しています。C# - 指定されたキャストはDataTableとFieldを使用して有効ではありません<int>

私は今DataTable

DataTable d = GetDataTableFromCSVFile(file); 
CoolObject l = new CoolObject(); 

for (int i = 0; i < d.Rows.Count; i++) 
{ 
    l.column1[i] = d.Rows[i].Field<int>("column1"); <-- error here 
} 

そしてここからのデータと私のオブジェクトを移入しようとしていますが残念ながら、私が強調表示された行でエラーが発生します私のCoolObject

public class CoolObject 
{ 
    public List<int> column1 { set; get; } 

    protected CoolObject() 
    { 
     column1 = new List<int>(); 
    } 
} 

です

System.InvalidCastException: Specified cast is not valid

これはなぜ許可されていませんか?どのように私はそれを回避するのですか?

+0

質問に答えるために必要な情報は、 'GetDataTableFromCSVFile'メソッドのコードです。表示してください。 – Fabio

答えて

-1

誰かのような音は、セルの1つに数字を入力しませんでした。値を読み取る前に、妥当性チェックを実行する必要があります。

for (int i = 0; i < d.Rows.Count; i++) 
{ 
    object o = d.rows[i]["column1"]; 
    if (!o is int) continue; 
    l.column1[i] = (int)o; 
} 

おそらくそれは数字ですが、何らかの理由で文字列として入力されている可能性があります。

for (int i = 0; i < d.Rows.Count; i++) 
{ 
    int n; 
    bool ok = int.TryParse(d.rows[i]["column1"].ToString(), out n); 
    if (!ok) continue; 
    l.column1[i] = n; 
} 
+0

提案のおかげでジョン、私は両方のあなたの提案を試みる –

-1

列の型は文字列ではなく文字列である可能性はありますか?もしそうなら、自分フィールド上Convert.ToInt32を使用します。

for (int i = 0; i < d.Rows.Count; i++) 
{ 
    l.column1[i] = Convert.ToInt32(d.Rows[i]["column1"]); 
} 
1

明らかにあなたがDataTableは、文字列型の列が含まれているので、この方法の消費者はそれを心配する必要はありませんので、GetDataTableFromCSVFile方法で整数の検証を行います。

明らかにDataTableには文字列型の列が含まれているので、GetDataTableFromCSVFileメソッドで整数検証を行います。したがって、このメソッドのコンシューマは気にする必要はありません。

private DataTable GetDataTableFromCSVFile() 
{ 
    var data = new DataTable(); 
    data.Columns.Add("Column1", typeof(int)); 

    // Read lines of file 

    // line is imaginery object which contains values of one row of csv data 
    foreach(var line in lines) 
    { 
     var row = data.NewRow(); 
     int.TryParse(line.Column1Value, out int column1Value) 
     row.SetField("Column1", column1Value) // will set 0 if value is invalid 

     // other columns 
    } 

    return data; 
} 

空のリストがインデックスにアイテムを持っていないので、次にリストは線の上

l.column1[i] = d.Rows[i].Field<int>("column1"); 

空であるあなたは、インデックスを通じてList<int>に新しい値をassugnことをあなたのコードを持つ別の問題は、例外がスローされますi

だから最後にあなたの方法は、あなたがDataTableにcsvファイルからデータを取得するためのいくつかのサードパーティのライブラリを使用している場合は

DataTable d = GetDataTableFromCSVFile(file); 
CoolObject l = new CoolObject(); 

foreach (var row in d.Rows) 
{ 
    l.column1.Add(row.Field<int>("column1")); 
} 

を見ていきます - そのライブラリは/変換を有効にする可能性を提供する場合、あなたは確認することができます文字列値をDataTableの予想される型に変換します。

関連する問題