我有一个类似这样的文本文件。
汤姆1 2 杰里3 4使用C#,我将其填充到两个数组中
1st array = {Tom,Jerry} - 1 dim array
第二个数组= {(1,2),(3,4)} - 2 dim array
请帮我解决这个问题。任何帮助,将不胜感激。
Console.WriteLine("Enter the file name with extension:");
string filename = Console.ReadLine();
string s = System.IO.File.ReadAllText("C:/Desktop/" + filename);
Console.WriteLine("\n Text Details in the file: \n \n"+s);
答案 0 :(得分:1)
有几种方法,这取决于你想成为多么“优雅”,和/或汤姆,杰瑞是否总会成为一个词。
最简单的方法就是这样(快速而肮脏,非常脆弱的解决方案):
var path = "fileName.txt";
var names = new List<string>();
var values = new List<KeyValuePair<int, int>>();
using (var reader = File.OpenText(path))
{
string s = "";
while ((s = reader.ReadLine()) != null)
{
String[] arr = s.Split(' ');
names.Add(arr[0]);
values.Add(new KeyValuePair<int, int>(int.Parse(arr[1]), int.Parse(arr[2])));
}
}
如果需要,可以将列表转换为数组
答案 1 :(得分:1)
我想这是对last question:)
的跟进更多hw提示:
正如我在上一篇回答中所说,拆分选项卡(假设每个项目由选项卡分隔,看起来就是这种情况)将为您提供一行中每个项目的一维数组(如果您使用ReadLine)。 / p>
ReadLine()数组中的项目1将是名称。把它放到你的1D名字数组中。 ReadLine()数组的项目2到N将是测试分数。把它放到2D分数数组中。
得分数组的第一个维度是学生索引。第二个维度是得分数组。
这可能听起来令人困惑,但如果你考虑一下,2D数组就是一个数组数组。
因此,即使您的数据文件未显示学生索引,也暗示:
0 Joe 100 80 77 1 Bob 65 93 100
名称数组如下所示:
[0] Joe [1] Bob
和得分数组看起来像:
[0][0] 100 [0][1] 80 [0][2] 77 [1][0] 65 [1][1] 93 [1][2] 100
请注意,score数组中的索引(第一维)与names数组的索引一致。
答案 2 :(得分:0)
更完整的版本;)
string filename = "";
do
{
Console.WriteLine("Enter the file name with extension:");
filename = Environment.GetEnvironmentVariable("HOMEDRIVE") + Environment.GetEnvironmentVariable("HOMEPATH") + "\\Desktop\\" + Console.ReadLine();
if (!System.IO.File.Exists(filename))
Console.WriteLine("File doesn't exist!");
else
break;
} while (true);
System.IO.StreamReader readfile = new System.IO.StreamReader(filename);
List<string> Names = new List<string>();
List<int[]> Numbers = new List<int[]>();
string val = "";
while ((val = readfile.ReadLine()) != null)
{
if (val == string.Empty)
continue;
List<string> parts = val.Split(' ').ToList<string>();
Names.Add(parts[0]);
parts.RemoveAt(0);
Numbers.Add(parts.ConvertAll<int>(delegate(string i) { return int.Parse(i); }).ToArray());
}
readfile.Close();
//Print out info
foreach (string name in Names)
{
Console.Write(name + ", ");
}
Console.WriteLine();
foreach (int[] Numberset in Numbers)
{
Console.Write("{");
foreach (int number in Numberset)
Console.Write(number + ", ");
Console.Write("} ");
}
Console.ReadLine();
答案 3 :(得分:0)
我喜欢功能性方法。
// var fileContent = System.IO.File.ReadAllText("somefilethathasthestuff");
var fileContent = @"Tom 1 2
Jerry 3 4";
var readData = fileContent.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries)
.Aggregate(new { names = new List<string>(), data = new List<int[]>() },
(result, line) => {
var fields = line.Split(new []{' '}, 2);
result.names.Add(fields[0]);
result.data.Add(fields[1].Split(new[] { ' ' }).Select(n => int.Parse(n)).ToArray());
return result;
}
);
string[] firstarray = readData.names.ToArray();
int[][] secondarray = readData.data.ToArray();
这会对数字使用锯齿状数组,但如果这是您真正需要的,则可以将其复制到2d。更好的是,根本不要复制到数组。使用列表&lt;串GT;对于名称和列表&lt; int []&gt;对于数字。