如何找到行中每个元素的数量,并使用C#将每行的平均值存储在另一个数组中



我使用以下代码逐行从文本文件中读取数据。我想将每一行分配到一个数组中。我必须能够找到行/数组的数量以及它们中每一个上的元素数量。

我还想对一些或所有行进行一些操作,并返回它们的值。

我得到了行数,但有没有一种方法可以循环类似于:

    *for ( i=1 to number of rows)
    do
    mean[i]<-row[i]
    done
    return mean*

var data = System.IO.File.ReadAllText("Data.txt");
var arrays = new List<float[]>();
var lines = data.Split(new[] {'r', 'n'}, StringSplitOptions.RemoveEmptyEntries);
foreach (var line in lines)
{
    var lineArray = new List<float>();
    foreach (var s in line.Split(new[] {','}, StringSplitOptions.RemoveEmptyEntries))
    {
        lineArray.Add(Convert.ToSingle(s));
    }
    arrays.Add(lineArray.ToArray());
}
var numberOfRows = lines.Count();
var numberOfValues = arrays.Sum(s => s.Length);
var arrays = new List<float[]>();
//....your filling the arrays
var averages = arrays.Select(floats => floats.Average()).ToArray(); //float[]
var counts = arrays.Select(floats => floats.Count()).ToArray(); //int[]

不确定我是否理解这个问题。你是说吗

foreach (string line in File.ReadAllLines("fileName.txt")
{
...
}

您可以使用Linq吗?您可能需要在顶部添加using System.Linq;

float floatTester = 0;
List<float[]> result = File.ReadLines(@"Data.txt")
        .Where(l => !string.IsNullOrWhiteSpace(l))
        .Select(l => new {Line = l, Fields = l.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries) })
        .Select(x => x.Fields
                      .Where(f => Single.TryParse(f, out floatTester))
                      .Select(f => floatTester).ToArray())
        .ToList();
// now get your totals
int numberOfLinesWithData = result.Count;
int numberOfAllFloats = result.Sum(fa => fa.Length);

说明:

  1. File.ReadLines读取文件的行(不是一次全部读取,而是扫射)
  2. Where只返回给定谓词为true的元素(例如,该行必须包含多个空文本)
  3. new {创建一个具有给定属性的匿名类型(例如用逗号分隔的字段)
  4. 然后我尝试将每个字段解析为float
  5. 所有可以解析的内容都将添加到具有ToArray()float[]
  6. 所有这些将一起添加到具有ToList()List<float[]>

找到了一种有效的方法。感谢大家的投入!

private void ReadFile()
    {
        var lines = File.ReadLines("Data.csv");
        var numbers = new List<List<double>>();
        var separators = new[] { ',', ' ' };
        /*System.Threading.Tasks.*/
        Parallel.ForEach(lines, line =>
        {
            var list = new List<double>();
            foreach (var s in line.Split(separators, StringSplitOptions.RemoveEmptyEntries))
            {
                double i;
                if (double.TryParse(s, out i))
                {
                    list.Add(i);
                }
            }
            lock (numbers)
            {
                numbers.Add(list);
            }
        });
        var rowTotal = new double[numbers.Count];
        var rowMean = new double[numbers.Count];
        var totalInRow = new int[numbers.Count()];
        for (var row = 0; row < numbers.Count; row++)
        {
            var values = numbers[row].ToArray();
            rowTotal[row] = values.Sum();
            rowMean[row] = rowTotal[row] / values.Length;
            totalInRow[row] += values.Length;
        }

相关内容

  • 没有找到相关文章

最新更新