C# - Stream Reader或者最好的方法是什么?

时间:2011-03-13 01:09:44

标签: c#

我有一个类似这样的文本文件。

汤姆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);

4 个答案:

答案 0 :(得分:1)

有几种方法,这取决于你想成为多么“优雅”,和/或汤姆,杰瑞是否总会成为一个词。

  • 使用String方法解析每一行
  • 使用RegEx解析每一行
  • 使用Linq to Text

最简单的方法就是这样(快速而肮脏,非常脆弱的解决方案):

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;对于数字。