Lesen aus einer Textdatei in einen gezackten Array
-
21-08-2019 - |
Frage
fand ich diese Frage in einer alten Frage in Ihrer Website, so dass ich dachte, dass ich es tun kann, aber ich denke, ich habe mich geirrt: -)
die alte Post wurde hier
Ich bin neu in der gezackten Array Sache so hat der folgenden Code
StreamReader rows = new StreamReader("c:\\practice.txt");
string line;
int i;
i=1;
while ((line = rows.ReadLine()) != null)
{
String[][]rows = new String [i][]; ;
rows = rows.ReadLine();
String[][] rows = new string[S.Length][];
i++;
}
for (int i; i < S.Length; i++)
{
row[i] = S[I].Split(',');
}
int totalCounter = 0, totalSum = 0;
// etc
foreach(string[] row in rows)
{
int m1 = int.Parse(row[3]);
totalCounter++;
totalSum += m1;
switch(row[2])
{
case "male":
maleCount++;
maleSum += m1;
break;
case "female":
femaleCount++;
femaleSum += m1;
break;
}
}
Ich weiß, dass ich große Fehler haben im Osten, aber ich versuchte, kann jemand mir helfen es ein workin Code zu machen
Lösung
Sie scheinen doppelt Lesen der Zeilen zu sein, oder vielleicht haben Sie vertauscht Zeilen und Zellen - dieses Bit insbesondere Aussehen wirklich ungerade:
while ((line = rows.ReadLine()) != null)
{
String[][]rows = new String [i][]; ;
rows = rows.ReadLine();
String[][] rows = new string[S.Length][];
i++;
}
d. Wieder erklärt Reihen, zwei Anrufe pro Schleife ReadLine
usw. Ich vermute, Sie meinen string.Split
? So oder so, entweder Verwendung File.ReadAllLines
, oder schauen Sie sich die gestern um einige Optionen vorgestellt. Wenn Sie verzweifelt sind Arrays zu verwenden, suchen Sie den Kern könnte so etwas wie:
using System;
using System.IO;
static class Program
{
static void Main()
{
string[] lines = File.ReadAllLines("foo.txt");
string[][] grid = new string[lines.Length][];
for (int i = 0; i < lines.Length; i++)
{
grid[i] = lines[i].Split(',');
}
int totalCount = 0, maleCount = 0, femaleCount = 0,
m1Total = 0, m2Total = 0, m3Total = 0,
m1MaleTotal = 0, m1FemaleTotal = 0;
foreach (string[] line in grid)
{
totalCount++;
int m1 = int.Parse(line[3]),
m2 = int.Parse(line[4]),
m3 = int.Parse(line[5]);
m1Total += m1;
m2Total += m2;
m3Total += m3;
switch (line[1].Trim())
{
case "male":
maleCount++;
m1MaleTotal += m1;
break;
case "female":
femaleCount++;
m1FemaleTotal += m1;
break;
}
}
Console.WriteLine("Rows: " + totalCount);
Console.WriteLine("Total m1: " + m1Total);
Console.WriteLine("Average m1: " + ((double)m1Total)/totalCount);
Console.WriteLine("Male Average m1: " + ((double)m1MaleTotal) / maleCount);
Console.WriteLine("Female Average m1: " + ((double)m1FemaleTotal) / femaleCount);
}
}
Auch hier - ich kann nicht genug betonen, wie viel Sie sollten statt manuellen Looping dies mit LINQ tun ...
Andere Tipps
Stellen Sie zunächst sicher, dass Sie nicht verwalteten Ressourcen wie Ströme in using-Anweisungen wickeln.
Persönlich mag ich meine LineReader Klasse, die es einfach macht, Textzeilen zu lesen aus einer Datei (oder irgendetwas anderes, tatsächlich).
Als nächstes würde ich Verwendung von Arrays vermeiden, wenn Sie wirklich zu haben. List<T>
ist in der Regel sehr viel angenehmer, mit zu arbeiten. Nun, wenn String.split tut, was Sie wollen, können Sie einfach einen List<String[]>
haben. Alternativ können Sie wahrscheinlich eine Menge Arbeit mit LINQ tun:
var query = from line in new LineReader("c:\\practice.txt")
let parts = line.Split(',')
select new { Gender=parts[2], Amount=int.Parse(parts[3]) };
mehrere Aggregate aus einem einzigen Datenstrom zu nehmen ist heikel in „normalen“ LINQ (weshalb Marc GRA und ich entwickeln Drücken LINQ ). Sie können jedoch eine normale foreach-Anweisung verwenden:
int totalCounter = 0, totalSum = 0;
int maleCount = 0, maleSum = 0, femaleCount = 0, femaleSum = 0;
foreach (var row in query)
{
totalCounter++;
totalSum += row.Amount;
switch (row.Gender)
{
case "male":
maleCount++;
maleSum += Amount;
break;
case "female":
femaleCount++;
femaleSum += Amount;
break;
}
}
Wenn Sie die Zeilen nach Geschlecht gruppieren könnten Sie in der Lage sein, dies noch einfacher zu machen, vor allem, wenn Sie wissen, dass das Geschlecht ist immer „männlich“ oder „weiblich“.