我正在尝试读取由标签'\ t'分隔的文本,并将其存储到对象列表中。 文字如下:
1 Name Number City
我尝试过这种方法,但它只适用于一行:
string line = sr.ReadLine();
string[] word = line.Split('\t');
for (int i = 0; i <= word.Length; i++)
ec.code = Convert.ToInt32(word[0]);
ec.Name = word[1];
ec.Number = Convert.ToInt32(word[2]);
ec.City = word[3];
list.Add(ec);
如何阅读列表中的所有行?
答案 0 :(得分:1)
假设文件中的每一行都遵循1 Name Number City
格式,您可以尝试:
var lines = File.ReadAllLines(filename);
foreach (var line in lines)
{
string[] word = line.Split('\t');
for (int i = 0; i <= word.Length; i++)
{
ec.code = Convert.ToInt32(word[0]);
ec.Name = word[1];
ec.Number = Convert.ToInt32(word[2]);
ec.City = word[3];
list.Add(ec);
}
}
答案 1 :(得分:0)
问题很简单,当你执行sr.ReadLine()
时,你只处理一行。相反,您可以考虑使用File.ReadAllLines
,它将所有行读入数组。您可以将其与Split
方法结合使用,从每行中提取所需的项目。
你的for循环也没有意义 - 看起来你正在循环遍历行中的每个单词,但是在循环体中你每次都要添加所有单词。我认为可以删除for
循环。
此外,还不清楚ec
是什么,但您应该在每次迭代时实例化一个新的// Class to represent whatever it is you're adding in your loop
class EC
{
public int Code { get; set; }
public string Name { get; set; }
public int Number { get; set; }
public string City { get; set; }
}
。否则,您只是一遍又一遍地向列表中添加相同的引用,它们都将具有相同的值(从最后一行读取)。
以下是我正在使用的示例类:
Split
我们应该做的一件事是,在将索引引入从调用IndexOutOfRange
返回的数组之前,我们应该确保首先有足够的项目。否则,如果我们尝试引用不存在的索引,我们将得到int.TryParse
异常。
另外,确保我们期望整数的字符串实际整数是个好主意。我们可以使用// Path to our file
var filePath = @"f:\public\temp\temp.txt";
// The list of things we want to create from the file
var list = new List<EC>();
// Read the file and create a new EC for each line
foreach (var line in File.ReadAllLines(filePath))
{
string[] words = line.Split('\t');
// First make sure we have enough words to create an EC
if (words.Length > 3)
{
// These will hold the integers parsed from our words (if parsing succeeds)
int code, number;
// Use TryParse for any values we expect to be integers
if (int.TryParse(words[0], out code) && int.TryParse(words[3], out number))
{
list.Add(new EC
{
Code = code,
Name = words[1],
Number = number,
City = words[3]
});
}
}
}
来做到这一点,它会在成功时返回true,并将out参数设置为已解析的值。
以下是使用所有这些想法的示例:
x <- c(rnorm(100))
y <- c(rnorm(100))
plot(x, col="blue")
lines(y, col = "red")