Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取2D数组中的列总数,但它总是使用C引发FormatException#_C#_.net_Arrays_Csv_Multidimensional Array - Fatal编程技术网

C# 获取2D数组中的列总数,但它总是使用C引发FormatException#

C# 获取2D数组中的列总数,但它总是使用C引发FormatException#,c#,.net,arrays,csv,multidimensional-array,C#,.net,Arrays,Csv,Multidimensional Array,我计划得到每列平均值的数组 但是我的应用程序在sum[j]+=int.Parse(csvArray[i,j])时崩溃。我尝试过使用Convert.ToDouble和Double.Parse,但它仍然抛出该异常 循环中的增量开始于1,因为CSV数组的行0和列0是字符串(名称和时间戳)。对于每列具有值的字段的除数或总计数,我只计算不为空的字段,因此使用IF语句。我想我需要帮助处理这个异常 下面是我现有的获取平均值的方法 public void getColumnAverages(string fil

我计划得到每列平均值的数组

但是我的应用程序在
sum[j]+=int.Parse(csvArray[i,j])时崩溃格式异常导致的代码>。我尝试过使用Convert.ToDouble和Double.Parse,但它仍然抛出该异常

循环
中的增量开始于1,因为CSV数组的
行0和列0
字符串(名称和时间戳)。对于每列具有值的字段的
除数
总计数
,我只计算
不为空的字段
,因此使用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);
            }
        }
    }
public void getColumnAverages(字符串文件路径)
{
int col=colCount(文件路径);
int row=rowCount(文件路径);
字符串[,]csvArray=csvToArray(文件路径);
int[]计数=新的int[col];
int[]和=新的int[col];
双精度[]平均值=新双精度[列];
对于(int i=1;i
我已经上传了我在测试原型时使用的。它在某些列上有
空白
值。我现有的IF语句是否无法处理该案例


由于我认为小数的数量,也有类似的条目
1.324556-e09
。我想我必须用
csvToArray(filePath)
方法来修剪它,或者还有其他有效的方法吗?万分感谢

因此,您的代码存在一些问题。格式异常的主要原因是,在查看CSV文件后,您的数字被引号包围。现在,我无法从您的代码中确切地看到如何将CSV文件转换为数组,但我猜您没有清除这些内容-当我第一次使用您的CSV运行时,我没有清除这些内容,并且遇到了完全相同的错误

然后我遇到了一个错误,因为CSV中的一些值是十进制的,所以不能使用数据类型
int
。我假设您仍然需要这些列的平均值,因此在我对您的方法稍加修改的版本中,我更改了以前使用的
double
类型的数组

正如@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");
    }
}
公共静态void getColumnAverages(字符串文件路径)
{
//与当前实现不同,将文件作为文本和
//按定义的delim拆分为数组
var filepath=@“C:\test.csv”;
var csvArray=File.ReadLines(文件路径)。选择(x=>x.Split(',')).ToArray();
//与当前的实现不同
var col=csvArray[0]。长度;
变量行=csvArray.Length;
//更新变量以使用双精度
双精度[]计数=新的双精度[列];
double[]和=新的double[col];
双精度[]平均值=新双精度[列];
Console.WriteLine(“已启动”);
对于(int i=1;i
那么,
csvArray[i,j]
失败时的值是多少?因为无法将字符串解析为整数,请在
csvArray
中包含由csvToArray填充的样本数据。我还建议使用
if(!string.IsNullOrWhitespace(csvArray[i,j])检查空格
,您可以使用
int.TryParse
来处理当前不是有效数字的情况all@musefan您好,我添加了一个屏幕截图。谢谢!@un幸运的是我已经手动检查过了,csvArray[1,1]的值是“23313”“。我不知道为什么它不能解析。非常感谢!关于文件路径,我在Web表单中使用了FileUpload控件,因为我必须将其上载到服务器。我想我看到了一个限制,在能够得到平均值数组之后。在现有系统中,它通过第一行的字符串列搜索
特定平均值。你能帮我想一个解决办法吗?@JPaulPunzalan我不确定我是否完全理解你所遇到的问题,你能再解释一下吗?嗨,今天工作了几个小时后,一切都正常了