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我不确定我是否完全理解你所遇到的问题,你能再解释一下吗?嗨,今天工作了几个小时后,一切都正常了