读取文本文件并填充数组

时间:2014-01-02 19:10:36

标签: c# file-io

我要读取一个文件并填充一个String数组。我的数据如下:

  

事故。
  意外和无意识的意外事件,突然发生在一个明确的地方。

     

事故频率。
  事故发生率,通常以一段时间内的事故数量表示。这是一种用于衡量防损服务有效性的方法。与事故严重程度对比。

     

事故预防。
  见防止损失服务。

     

事故严重程度   衡量损失的严重程度或严重程度,而不是损失的数量。它是根据工作时间而不是个别事故的数量来衡量的。这是衡量防损服务有效性的另一种方法。与事故频率对比。

我的代码是:

private void openfile_Click(object sender, EventArgs e)
{
    if (text.Text == String.Empty)
    {
        err.SetError(text, "Needs to contain Text");
    }

    DialogResult result = open_dialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        try
        {
            string file_name = open_dialog.FileName;
            System.IO.StreamReader sr = new System.IO.StreamReader(file_name);

            String line;
            String[] wordslist=new String[count];

            using (StreamReader reader = File.OpenText(file_name))
            {
                // read each line, ensuring not null (EOF)
                while ((line = reader.ReadLine()) != null)
                {
                    if (line == String.Empty)
                    {
                    }
                    else
                    {
                        wordslist = line.Split(' ');
                        count += 1;
                    }
                }
            }

            for (int i=0;i<wordslist.Length;i++)
            {
                //if (str==(text.Text))
                //{
                    //var index = Array.FindIndex(wordslist, row => row.Contains(text.Text));
                    Console.WriteLine("\ncapacity " + wordslist[i]);
                    //Console.WriteLine("\n" + wordslist[index - 1]+" capacity");
               //}

            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("\n\nERROR= " + ex);
        }
    }
}

我只想打印正在填充文件内容的数组的内容,但是没有填充数组。但是当我删除数据之间的空行时,数组将填充几行,我可以打印一些但不是所有内容。

问题是我的数据太大了,我无法删除行,也不想成为!有没有解决办法让我能正确地做到这一点?

4 个答案:

答案 0 :(得分:2)

有一系列问题。首先是这一行;

  String[] wordslist=new String[count];

这没有任何作用。它创建一个长度为零的数组,并将wordslist引用设置为。

然后这是真正的问题;

   wordslist = line.Split(' ');

Split返回一个新的字符串数组,它不会添加到当前的数组。您只得到最后一行,因为wordslist被设置为在循环的最后一次迭代中在该行上调用split的结果。您可以通过执行来修复代码;

  List<string> wordslist = new List<string>();

然后做;

  wordslist.Add(line.Split(' '));

添加项目。 List<T>是一个动态数组,必要时会增长。 T[](数组)无法动态增长,因此不适合读取文件。

这是另一个建议(我将如何做);

  string[] words = File.ReadAllLines(path).Where(x => !x.IsNullOrEmpty())
                                          .Select(x => x.Split(' '))
                                          .SelectMany();

首先是一个班轮,将文件的每一行读入string[],然后应用Where,并删除所有空行。之后,每一行都在空格上分割,它给你一个IEnumerable<string[]>(一个字符串数组列表,其中每个数组都是一行值词),最后SelectMany“扁平化”列表意味着它结合了所有将这些数组合并为一个。

答案 1 :(得分:2)

您可以使用Linq

var wordslist= System.IO.File.ReadAllLines("filename")
              .Where(x => !string.IsNullOrWhiteSpace(x))
              .SelectMany(x => x.Split(' '));

foreach(var word in wordlist)
{
   Console.WriteLine("\ncapacity " + word);
}

答案 2 :(得分:0)

private void openfile_Click(object sender, EventArgs e) {
    if (text.Text == String.Empty) {
        err.SetError(text, "Needs to contain Text");
    }

    DialogResult result = open_dialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        try
        {
            string file_name = open_dialog.FileName;
            System.IO.StreamReader sr = new System.IO.StreamReader(file_name);

            String line;
            List<string> wordslist=new List<string>(count);

            using (StreamReader reader = File.OpenText(file_name))
            {
                // read each line, ensuring not null (EOF)
                while ((line = reader.ReadLine()) != null)
                {
                    if (line != String.Empty) {
                        // Here instead of replacing array with new content
                        // we add new words to already existing list of strings
                        wordslist.AddRange(line.Split(' '));
                        count += 1;
                    }
                }
            }

            // Count instead of Length because we're using List<T> now
            for (int i=0;i<wordslist.Count;i++)
            {
                Console.WriteLine("\ncapacity " + wordslist[i]);
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine("\n\nERROR= " + ex);
        }
    }

}

答案 3 :(得分:0)

我不确定我是否理解你的要求,但看起来你想要阅读没有空行的文件内容? 你的代码非常混乱,你可以在这里找到一些将从文件中返回所有非空行的内容。

List<string> readIt(string fileName)
{
    string line;
    List<string> data = new List<string>();
    StreamReader file = new StreamReader(fileName);
    while((line = file.ReadLine()) != null)
    { if (line!="") data.Add(line); }
    file.Close();
    return data;
}