我要读取一个文件并填充一个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);
}
}
}
我只想打印正在填充文件内容的数组的内容,但是没有填充数组。但是当我删除数据之间的空行时,数组将填充几行,我可以打印一些但不是所有内容。
问题是我的数据太大了,我无法删除行,也不想成为!有没有解决办法让我能正确地做到这一点?
答案 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;
}