前提・実現したいこと
C#を使ってテキストファイルベースのある解析データを処理しようとしております。
処理の内容は,元のファイルから必要なデータをDataTableに格納した後に,乗算を行うという単純なものになります。
以下に流れを示すと,
1.ループでDataTable3のi行目を読み込む。
2.DataTable3中のデータをParseを用いてdouble型に変換。
3.DataTable3.Rows[i+1][2]>0,DataTable3.Rows[i+2][2]<0なら,乗算してそれぞれ個別のlistに追加する。
4.次の目標の行は4行先なので,i=i+3とする。
ここで問題が生じているのは,2のDataTableの中をdouble型に変換する箇所なのですが,必ず一番最後の要素で**入力文字列の形式が正しくありません。**と表示されてしまいます。
そこでdouble型に変換する前にstring check1,2に置き換えて確認したところ,string check2が""になっていました。
しかしDataTableは,元データを配列に格納して,そのうち文字列と空白を削除してlist<double>型に格納してDataTable.Rowに追加していることから,""となる意味が理解できませんでした。
追記:一番最後の要素とは,画像に示すi=156時A(157)のように,次の4行目(A161)にデータがない場合という意味になります。
発生している問題・エラーメッセージ
System.FormatException: '入力文字列の形式が正しくありません。'
該当のソースコード
C#
1private void GetShearForce(DataTable DataTable3) 2 { 3 dblNumOfFormerElement = double.Parse(DataTable3.Rows[0][0].ToString()); 4 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[0][1].ToString()); 5 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[0][2].ToString()); 6 7 for (int i = 0; i < DataTable3.Rows.Count; i++) 8 { 9 if (dblNumOfFormerElement - double.Parse(DataTable3.Rows[i][0].ToString()) +1 < 0 || 10 dblTypeOfFormerElement != double.Parse(DataTable3.Rows[i][1].ToString()) || 11 dblThicknessOfFormerElement != double.Parse(DataTable3.Rows[i][2].ToString()) 12 ) 13 { 14 var result = MessageBox.Show($"要素X方向のサイズもしは要素番号が変化しました。現在と異なるグループですか?" + 15 $"\r\n要素番号{dblNumOfFormerElement}→{double.Parse(DataTable3.Rows[i][0].ToString())}" + 16 $"\r\n要素タイプ番号{dblTypeOfFormerElement}→{double.Parse(DataTable3.Rows[i][1].ToString())}" + 17 $"\r\n要素厚さ{dblThicknessOfFormerElement}→{double.Parse(DataTable3.Rows[i][2].ToString())}","Notify",MessageBoxButton.YesNo); 18 if (result == MessageBoxResult.Yes) 19 { 20 listPositiveShearForce.Add(listTempData1.Sum()); 21 listNegativeShearForce.Add(listTempData2.Sum()); 22 listTempData1 = new List<double>(); 23 listTempData2 = new List<double>(); 24 } 25 } 26 27 if (strLoadingStep == "PositiveToNegative") 28 { 29 if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) < 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) > 0) 30 { 31 listTempData1.Add(double.Parse(DataTable3.Rows[i + 1][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 32 listTempData2.Add(double.Parse(DataTable3.Rows[i + 2][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 33 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 34 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 35 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 36 i = i + 3; 37 continue; 38 } 39 else if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) > 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) > 0) 40 { 41 listTempData2.Add(double.Parse(DataTable3.Rows[i + 2][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 42 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 43 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 44 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 45 i = i + 3; 46 continue; 47 } 48 else if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) < 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) < 0) 49 { 50 listTempData1.Add(double.Parse(DataTable3.Rows[i + 1][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 51 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 52 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 53 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 54 i = i + 3; 55 continue; 56 } 57 else 58 { 59 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 60 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 61 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 62 i = i + 3; 63 continue; 64 } 65 } 66 else 67 { 68 string check1 = DataTable3.Rows[i + 1][2].ToString(); 69 string check2 = DataTable3.Rows[i + 2][2].ToString(); 70 71 if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) > 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) < 0) 72 { 73 listTempData2.Add(double.Parse(DataTable3.Rows[i + 1][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 74 listTempData1.Add(double.Parse(DataTable3.Rows[i + 2][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 75 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 76 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 77 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 78 i = i + 3; 79 continue; 80 } 81 else if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) < 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) < 0) 82 { 83 listTempData1.Add(double.Parse(DataTable3.Rows[i + 2][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 84 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 85 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 86 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 87 i = i + 3; 88 continue; 89 } 90 else if (double.Parse(DataTable3.Rows[i + 1][2].ToString()) > 0 & double.Parse(DataTable3.Rows[i + 2][2].ToString()) > 0) 91 { 92 listTempData2.Add(double.Parse(DataTable3.Rows[i + 1][2].ToString()) * double.Parse(DataTable3.Rows[i][1].ToString()) * double.Parse(DataTable3.Rows[i][2].ToString())); 93 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 94 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 95 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 96 i = i + 3; 97 continue; 98 } 99 else 100 { 101 dblTypeOfFormerElement = double.Parse(DataTable3.Rows[i][1].ToString()); 102 dblThicknessOfFormerElement = double.Parse(DataTable3.Rows[i][2].ToString()); 103 dblNumOfFormerElement = double.Parse(DataTable3.Rows[i][0].ToString()); 104 i = i + 3; 105 continue; 106 } 107 } 108 } 109 110 listPositiveShearForce.Add(listTempData1.Sum()); 111 listNegativeShearForce.Add(listTempData2.Sum()); 112 113 for (int i = 0; i < listPositiveShearForce.Count; i++) 114 { 115 DataTable4.Columns.Add(i.ToString()); 116 } 117 118 DataTable4.Rows.Add(listPositiveShearForce); 119 DataTable4.Rows.Add(listNegativeShearForce); 120 return; 121 }
試したこと
まずDataTableをCSV形式で保存して内容を確認。画像黄色で塗りつぶした箇所がエラー時に参照しようとしているデータ。
dblNumOfFormerElementがエクセルの(A153)の1653であるので,現在読み込もうとしている行が(A157)の1654であることはi=156であることから確認できる。
check1=DataTable3.Rows[i+1][2].ToString()が-0.219と参照が正しく行えている。
check1=DataTable3.Rows[i+2][2].ToString()が本来-0.223であるが,実際は""と参照ができていない。
DataTableをDataGridにバインディングした結果。空白等は確認できない。
追記:i=157に該当するItemArray
追記:i=158に該当するItemArray
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。