2012-07-18 3 views
0

아래 코드를 사용하여 텍스트 파일의 데이터를 행 단위로 읽습니다. 각 배열을 배열에 할당하고 싶습니다. 번호 또는 행/배열과 각 요소의 수를 찾을 수 있어야합니다.행의 각 요소의 번호를 찾고 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); 

답변

0

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; 
     } 
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[] 
0

은.

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

토마스와 내 대답을 결합 할 수도 있습니다. – AlexDev

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 지정된 조건이 true 인 요소 만있는 파일의 라인 (안 한꺼번에하지만 straming)
  2. Where 수익을 읽는다 (FE 라인이 있어야합니다 빈 텍스트 이상)
  3. new {은 주어진 속성으로 쉼표로 구분 된 익명 형식을 만듭니다 (쉼표로 구분 된 필드는 제외)
  4. 그런 다음 나는 떠 각 필드를 구문 분석하려고
  5. ToArray()와 함께 float[]에 추가됩니다 구문 분석 할 수
  6. 모든
  7. 모두 함께 찾을 수 ToList()
관련 문제