Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/320.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/5/excel/25.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# 使用linq c计算CSV文件中列的平均值#_C#_Excel_Linq_File_Csv - Fatal编程技术网

C# 使用linq c计算CSV文件中列的平均值#

C# 使用linq c计算CSV文件中列的平均值#,c#,excel,linq,file,csv,C#,Excel,Linq,File,Csv,我对c#非常陌生,但我真的很想开始使用linq从excel电子表格中提取简单信息 我很不好意思问这个问题,但我似乎找不到解决办法。基本上,我想要的就是在一个CSV文件中找到平均捐赠金额 到目前为止,这是以下代码: using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; namespac

我对c#非常陌生,但我真的很想开始使用linq从excel电子表格中提取简单信息

我很不好意思问这个问题,但我似乎找不到解决办法。基本上,我想要的就是在一个CSV文件中找到平均捐赠金额

到目前为止,这是以下代码:

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CSharpTest
{
    class Program
{
    public string Donor { get; set; }
    public DateTime Date { get; set; }
    public decimal Amount { get; set; }
    public string Charity { get; set; }

    static void Main(string[] args)
    {
        {

            var file = "C:\\Users\\user\\Desktop\\Donations.csv".AsFile();

            File.ReadAllLines(file).Select(x => x.Split('\n')).Average(x => x.Count());


        }

    }
}

问题是我知道这是错误的,因为我只想要数量上的值。对于这种情况,我肯定应该使用GroupBy(),但是我似乎无法提取公共类的数量。如果有人能为我指出正确的方向,我将不胜感激。非常感谢。

创建一个对象模型来保存数据是一个良好的开端

var total = 0.0d;
foreach (var line in File.ReadLines(//FilePath))
{
    var lineArr = line.Split(',');

    double lineDonation;
    if (double.TryParse(lineArr[2])
        total += lineDonation;
}
public class Donation {
    public string Donor { get; set; }
    public DateTime Date { get; set; }
    public decimal Amount { get; set; }
    public string Charity { get; set; }
}
接下来,您要解析CSV文件中的数据

类似的内容有助于将数据解析为可用对象

var textReader = new StreamReader("C:\\Users\\user\\Desktop\\Donations.csv");
var csv = new CsvReader( textReader );
var records = csv.GetRecords<Donation>();
如果无法使用类似于from的外部库,您可以保留相同的原则,但可以手动解析:

public class Model
{
    public int Id { get; set; }
    public string Donor { get; set; }
    public DateTime Date { get; set; }
    public decimal Amount { get; set; }
    public string Charity { get; set; }
}


string csv =  File.ReadAllText(file);

//skip(1), for hearder
var lines = csv.Split(new char[] {'\n'}, StringSplitOptions.RemoveEmptyEntries).Skip(1);
List<Model> models = new List<Model>();

int id=1;
foreach (var item in lines)
{
    var values = item.Split(',');
    if(values.Count()!= 4) continue;//error loging

    var model = new Model
    {
        Id = id,
        Donor = values[0],
        Date = DateTime.Parse(values[1]),
        Amount = Decimal.Parse(values[2]),
        Charity = values[3]
    };

    models.Add(model);

    id++;
}
平均每人

var avgPerPerson = models 
                    .GroupBy(x=> x.Donor)
                    .Select(g=> new {
                      Donor = g.Key,
                      Average = g.Average(c => c.Amount)
                    });

您可以使用Microsoft Excel软件包“Microsoft.Office.Interop.Excel”。您可以从Nuget轻松下载:

    static void Main(string[] args)
    {
        Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();

        if (xlsApp == null)
        {
            //Any message
        }

        Workbook wb = xlsApp.Workbooks.Open("C:\\Users\\310231566\\Downloads\\main.xlsx",
            0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true);
        Sheets sheets = wb.Worksheets;
        Worksheet ws = (Worksheet)sheets.get_Item(1);

        Range firstColumn = ws.UsedRange.Columns[1];
        System.Array myvalues = (System.Array)firstColumn.Cells.Value;
        string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
        int j = 0;
        int avg = 0;
        int[] intArray = new int[strArray.Length-1];
        for (int i = 1; i < strArray.Length; i++)
        {
            intArray[j] = int.Parse(strArray[i]);
            avg  = avg + intArray[j];
            j++;
        }

        avg = avg/intArray.Length;
    }
static void Main(字符串[]args)
{
Microsoft.Office.Interop.Excel.Application xlsApp=新的Microsoft.Office.Interop.Excel.Application();
如果(xlsApp==null)
{
//有消息吗
}
工作簿wb=xlsApp.Workbooks.Open(“C:\\Users\\310231566\\Downloads\\main.xlsx”,
0,true,5,“,”,true,XlPlatform.xlWindows,“\t”,false,false,0,true);
工作表=wb.工作表;
工作表ws=(工作表)工作表。获取项目(1);
Range firstColumn=ws.UsedRange.Columns[1];
System.Array myvalues=(System.Array)firstColumn.Cells.Value;
字符串[]strArray=myvalues.OfType().Select(o=>o.ToString()).ToArray();
int j=0;
int平均值=0;
int[]intArray=新int[strArray.Length-1];
for(int i=1;i
每个在线捐赠者的平均金额,无故障保护:

var avg =  File
        .ReadAllLines(file)
        .Skip(1)
        .Select(x => x.Split(','))
        .Select((x,i) => new {
                Donor = values[0],
                Amount = Decimal.Parse(values[2])
            })
        .GroupBy(x=> x.Donor)
        .Select(g=> new {
          Donor = g.Key,
          AverageAmount = g.Average(c => c.Amount)
        });

时间?你想要的是每人的平均值还是整个文件的平均值?你只需要分组,如果你想要平均每人或什么。如果只需要整个列的平均值,则无需分组。您需要做的是将
(而不是
\n
-您已经有行)上的每一行拆分,取第三项(金额),将其解析为数字类型(例如十进制),然后应用平均运算符。正如其他人所说,使用CSV解析器可以简化其中的几个步骤。我一定会看看CSV helper,非常感谢-@DragandDropI只是在平均值之后才做了一个整体,很抱歉没有说得更清楚。哦,当然,继续,会更有意义。当您说获取第三项时,它会是这样的:.Select(x=>x[2]…?然后它会给出一个TryParseAs()。非常感谢您的帮助@Chris@DanielLee:大致上是的,获取第三项将按
x[2]进行
或类似内容。不过,请务必使用CSV解析器阅读以下答案。通常,使用CSV解析器会更好。例如,如果您的第一列有“Smith,John”等值那么,你只在逗号上拆分的方法将不再有效,因为你需要担心该字段是如何转义该逗号的。使用CSV解析器是解决该问题的一个更健壮的解决方案。这当然会让事情看起来更简单,我一定会看一看,非常感谢!!!!谢谢你,我也会尝试一下!This肯定不是我遇到过的东西,我一定会看一看并试着理解它,非常感谢,如果您在执行此代码时需要任何帮助,请告诉我
    static void Main(string[] args)
    {
        Microsoft.Office.Interop.Excel.Application xlsApp = new Microsoft.Office.Interop.Excel.Application();

        if (xlsApp == null)
        {
            //Any message
        }

        Workbook wb = xlsApp.Workbooks.Open("C:\\Users\\310231566\\Downloads\\main.xlsx",
            0, true, 5, "", "", true, XlPlatform.xlWindows, "\t", false, false, 0, true);
        Sheets sheets = wb.Worksheets;
        Worksheet ws = (Worksheet)sheets.get_Item(1);

        Range firstColumn = ws.UsedRange.Columns[1];
        System.Array myvalues = (System.Array)firstColumn.Cells.Value;
        string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
        int j = 0;
        int avg = 0;
        int[] intArray = new int[strArray.Length-1];
        for (int i = 1; i < strArray.Length; i++)
        {
            intArray[j] = int.Parse(strArray[i]);
            avg  = avg + intArray[j];
            j++;
        }

        avg = avg/intArray.Length;
    }
var avg =  File
        .ReadAllLines(file)
        .Skip(1)
        .Select(x => x.Split(','))
        .Select((x,i) => new {
                Donor = values[0],
                Amount = Decimal.Parse(values[2])
            })
        .GroupBy(x=> x.Donor)
        .Select(g=> new {
          Donor = g.Key,
          AverageAmount = g.Average(c => c.Amount)
        });