2017-01-24 5 views
0

を使用してFormatExceptionをスローするの平均値の配列を取得する予定です。2D配列の列の合計を取得するが、常にC#

FormatExceptionのため、私のアプリはsum[j] += int.Parse(csvArray[i,j]);でクラッシュします。私はConvert.ToDoubleとDouble.Parseを使用しようとしましたが、それでもその例外はスローされます。 CSVアレイのためRow 0 and Column 0for loop開始に

増分はストリング(名称及びタイムスタンプ)です。 divisorまたはtotal count of the fields that have values per columnについては、not BLANKのフィールドしかカウントしないため、IFという文がカウントされます。私は例外を処理する際に助けが必要だと思います。

以下は平均を得る方法の私の存在です。

public void getColumnAverages(string filePath) 
     { 

      int col = colCount(filePath); 
      int row = rowCount(filePath); 

      string[,] csvArray = csvToArray(filePath); 
      int[] count = new int[col]; 
      int[] sum = new int[col]; 
      double[] average = new double[col]; 

      for (int i = 1; i < row; i++) 
      { 
       for (int j = 1; j < col; j++) 
       { 
        if (csvArray[i,j] != " ") 
        { 
         sum[j] += int.Parse(csvArray[i,j]); 
         count[j]++; 
        } 
       } 
      } 

      for (int i = 0; i < average.Length; i++) 
      { 
       average[i] = (sum[i] + 0.0)/count[i]; 
      } 

      foreach(double d in average) 
      { 
       System.Diagnostics.Debug.Write(d); 
      } 
     } 
    } 

私はプロトタイプをテストするとき私が使用CSV fileをアップロードしています。一部の列にはBLANKという値があります。私の存在だったIF文はそのようなケースを扱うことができませんか?

また、1.324556-e09のようなエントリがあります。私はcsvToArray(filePath)方法でそれをトリミングしなければならないか、または他の効率的な方法がありますか?感謝万円!

+0

だから 'csvArray [I、J]'それが失敗した時点での値は何ですか? – musefan

+0

その文字列を整数として解析できなかったため、csvArrayによってcsvToArrayによって生成されたサンプルデータを含めてください –

+0

'if(!string.IsNullOrWhitespace(csvArray [i、j]))'で空白をチェックすることもお勧めします。あなたは 'int.TryParse'を使用して、有効な数字ではない場合に処理することができます – musefan

答えて

0

コードにはいくつか問題があります。フォーマット例外の主な理由は、CSVファイルを見た後で、数字が引用符で囲まれていることです。 CSVファイルを配列に変換する方法をコードから正確に見ることはできませんが、これらをクリアしないと思います。CSVで初めて実行したときと全く同じエラーが発生しました。

CSVの値の一部が小数であるため、データ型がintであるため、エラーが発生しました。私はあなたがまだこれらの列の平均が欲しいと仮定しているので、あなたのメソッドの若干改訂されたバージョンでは、使用された配列をタイプdoubleに変更します。

AS @musefanが提案しましたが、IsNullOrWhiteSpaceメソッドを使用するための空き地のチェックも変更しました。

最後に結果を出力すると平均値列の最初の値がNaNになります。これは、配列の最初の位置にデータを処理しないよう考慮していないためです。文字列値。私は意図した目的がわからないので、この動作を修正するのが最善であるとは確信できません - これは大丈夫かもしれません - したがって、私は今これを変更していません。あなたがこれを並べ替える方法の助けが必要な場合!

だからここ更新方法であって、

public static void getColumnAverages(string filePath) 
{ 

    // Differs from the current implementation, reads a file in as text and 
    // splits by a defined delim into an array 
    var filePaths = @"C:\test.csv"; 
    var csvArray = File.ReadLines(filePaths).Select(x => x.Split(',')).ToArray(); 

    // Differs from the current implementation 
    var col = csvArray[0].Length; 
    var row = csvArray.Length; 

    // Update variables to use doubles 
    double[] count = new double[col]; 
    double[] sum = new double[col]; 
    double[] average = new double[col]; 
    Console.WriteLine("Started"); 
    for (int i = 1; i < row; i++) 
    { 
     for (int j = 1; j < col; j++) 
     { 
      // Remove the quotes from your array 
      var current = csvArray[i][j].Replace("\"", ""); 

      // Added the Method IsNullOrWhiteSpace 
      if (!string.IsNullOrWhiteSpace(current)) 
      { 
       // Parse as double not int to account for dec. values 
       sum[j] += double.Parse(current); 
       count[j]++; 
      } 
     } 
    } 

    for (int i = 0; i < average.Length; i++) 
    { 
     average[i] = (sum[i] + 0.0)/count[i]; 
    } 

    foreach (double d in average) 
    { 
     System.Diagnostics.Debug.Write(d + "\n"); 
    } 
} 
+0

ありがとう!ファイルパスに関しては、Webフォームで** FileUpload **コントロールを使用しました。サーバーにアップロードする必要があるからです。私は、平均の配列を得ることができた後、**制限**を見ていると思う。既存のシステムでは、最初の行の**文字列**によって「特定の平均」を検索します。その回避策を考えてもらえますか? – JPaulPunzalan

+0

@JPaulPunzalan私はあなたが持っている問題を完全に理解しているかどうかはわかりませんが、もう少し説明できますか? –

+0

こんにちは、今日の仕事で何時間もコーディングしてから、すべてが今は完璧に機能しています。私は何とかそれを考え出した。特定の列ヘッダーの列平均を取得するために「辞書」を使用しました。ここのレッスンは永遠に私と一緒にくつろいでいます。感謝万円! :) – JPaulPunzalan

関連する問題