0

以下のコードを使用して、テキストファイルから行ごとにデータを読み取ります。各行を配列に割り当てたいと思います。行/配列の数と、それぞれの要素の数を見つけることができなければなりません。

また、一部またはすべての行を操作して、それらの値を返したいと思います。

行数を取得しますが、次のようにループする方法はありますか?

    *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);
4

4 に答える 4

0

これを行うための効率的な方法を見つけました。みなさん、ご意見ありがとうございます!

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;
        }
于 2012-08-03T07:00:06.187 に答える
0
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[]
于 2012-07-18T12:17:33.780 に答える
0

質問を理解したかどうかわかりません。のような意味ですか

foreach (string line in File.ReadAllLines("fileName.txt")
{
...
}
于 2012-07-18T12:17:34.123 に答える
0

使っても大丈夫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ファイルの行を読み取ります(一度にすべてではなく、straming)
  2. Where指定された述語がtrueである要素のみを返します(行に空のテキスト以上が含まれている必要がある場合)
  3. new {指定されたプロパティを使用して匿名タイプを作成します(フィールドをコンマで区切ってください)
  4. 次に、各フィールドを解析してフロートさせようとします
  5. 解析できるものはすべてfloat[]withに追加されますToArray()
  6. すべて一緒にとに追加されList<float[]>ますToList()
于 2012-07-18T12:25:10.770 に答える