C# stream reader 读取行存入数据
C# stream reader read line to stor in data
我这里有 sample.txt:
ABCDEABCDEABCDEABCDE
1000 ABCDEABCDEABCDEABCDE
1001 BCDEABCDEABCDEABCDEA
1002 CDEABCDEABCDEABCDEAB
1003 DEABCDEABCDEABCDEABC
1004 EABCDEABCDEABCDEABCD
1005 AABBCCDDEEABCDEABCDE
1006 ABBCCDDEEAABCDEABCDE
1007 ACBEDADCEBBCDEAABABA
1008 AAAAAAAAAAAAAAAAAAAA
1009 BBBBBBBBBBBBBBBBBBBB
1010 EEEEEEEEEEEEEEEEEEEE
1011 CCCCCCCCCCCCCCCCCCCC
1012 DDDDDDDDDDDDDDDDDDDD
0000
第一行是标准答案,后面是学号(4位)和学生答案(20位)。
并且要求是除非学生 ID =0000,否则读取行到 array.array[0]=student1 id,array[1]=student 1 answeer。或 studentID[0]=学生 1 ID,answer[0]=学生 1 答案。
我不熟悉增加 i 的 while 条件。
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
int id;
string line;
string[] token;
var lineCount = File.ReadLines("C:\testresult\exam.txt").Count();
Console.WriteLine(lineCount);
string[] record = new string[lineCount];
try
{
StreamReader sr = new StreamReader("C:\testresult\exam.txt");
line = sr.ReadLine();
line = sr.ReadLine();
token = line.Split();
id = Convert.ToInt32(token[0]);
while (id != 0)
{
{
Console.WriteLine(token[1]);
line = sr.ReadLine();
token = line.Split();
id = Convert.ToInt32(token[0]);
for (int i = 0; i < lineCount; i = i + 2)
{
record[i]=Convert.ToString(id);
record[i + 1] = token[1];
Console.WriteLine(record[i], record[i + 1]);
}
}
}
sr.Close();
Console.ReadLine();
}
catch { }
}
}
}
谁能建议如何逐行读取并每次将 id 和 token[0] 存储到数组中的每个元素中?
让我们运行了解几个基本的学习要点。
- 不要做
try...catch
除非你真的要做某事
除了例外。
- StreamReader 是
IDisposable
所以应该在 using
块中
- 发布的代码将遍历整个文件两次。小文件不是问题;但我想指出这一点。
- 尝试养成只声明变量的习惯,使其尽可能接近它们在其中使用的 'scope' - 它使您的代码更易于阅读和维护(例如,在移动代码时),并且有在循环内声明局部变量不会影响性能。
- String.Split总会给你一个项目(第0个)但是你在使用第一个项目
token[1]
而不检查是否有,当Id=0时不会有,这会给你一个 IndexOutOfRangeException。
- 你有一对没有明显原因的匹配大括号,可以而且应该删除它们(保持你的代码简单)。
- 对于
while
循环中的 for
循环,您肯定感到困惑。您的 while
循环将针对文件中除第一行以外的每一行执行,因此您只需要计算循环的次数。
- 如果你想让你的代码多一点 'defensive' 你可以使用 int.TryParse 而不是 Convert.ToInt32;但我假设你不担心那个。
所以这会给你...
static void Main(string[] args)
{
var records = new List<string>();
foreach (string line in File.ReadLines("C:\testresult\exam.txt").Skip(1))
{
var tokens = line.Split();
int id = Convert.ToInt32(tokens[0]);
if (id == 0)
{
break;
}
else if (tokens.Length > 1)
{
// It looks like you want the Id and values to be put consecutively in the same array, which doesn't seem very useful.
// I would have thought a Dictionary<int,string> would be more useful... but here you go.
records.Add(id.ToString());
records.Add(tokens[1]);
}
}
// If you really want records to be an array you can use "records.ToArray()"
Console.ReadLine();
}
您可以使用哈希Table来记录您的数据。
例如:
//Record data to Hash Table
Hashtable hash = new Hashtable();
StreamReader sr = new StreamReader(@"C:\Users\Binh\Desktop\C#\test\exam.txt");
while(sr.EndOfStream == false)
{
string line = sr.ReadLine();
if(!line.StartsWith("0") && !Regex.IsMatch(line, @"^[A-Z]"))
{
string[] info = line.Split(' ');//Split string
string strudent_id = info[0];
string student_ans = info[1];
hash.Add(strudent_id, student_ans);
}
}
sr.Close();
//Watch the result
foreach (DictionaryEntry item in hash)
{
Console.WriteLine(item.Key + "," + item.Value);
//OUTPUT:
//1007,ACBEDADCEBBCDEAABABA
//1009,BBBBBBBBBBBBBBBBBBBB
//1010,EEEEEEEEEEEEEEEEEEEE
//1012,DDDDDDDDDDDDDDDDDDDD
//1001,BCDEABCDEABCDEABCDEA
//1002,CDEABCDEABCDEABCDEAB
//1004,EABCDEABCDEABCDEABCD
//1006,ABBCCDDEEAABCDEABCDE
//1008,AAAAAAAAAAAAAAAAAAAA
//1011,CCCCCCCCCCCCCCCCCCCC
//1000,ABCDEABCDEABCDEABCDE
//1003,DEABCDEABCDEABCDEABC
//1005,AABBCCDDEEABCDEABCDE
}
例如:如果你想得到 ID 为 1009 的学生的答案
string answer = hash["1009"].ToString();
Console.WriteLine(answer);//Return BBBBBBBBBBBBBBBBBBBB
我这里有 sample.txt:
ABCDEABCDEABCDEABCDE
1000 ABCDEABCDEABCDEABCDE
1001 BCDEABCDEABCDEABCDEA
1002 CDEABCDEABCDEABCDEAB
1003 DEABCDEABCDEABCDEABC
1004 EABCDEABCDEABCDEABCD
1005 AABBCCDDEEABCDEABCDE
1006 ABBCCDDEEAABCDEABCDE
1007 ACBEDADCEBBCDEAABABA
1008 AAAAAAAAAAAAAAAAAAAA
1009 BBBBBBBBBBBBBBBBBBBB
1010 EEEEEEEEEEEEEEEEEEEE
1011 CCCCCCCCCCCCCCCCCCCC
1012 DDDDDDDDDDDDDDDDDDDD
0000
第一行是标准答案,后面是学号(4位)和学生答案(20位)。 并且要求是除非学生 ID =0000,否则读取行到 array.array[0]=student1 id,array[1]=student 1 answeer。或 studentID[0]=学生 1 ID,answer[0]=学生 1 答案。 我不熟悉增加 i 的 while 条件。
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
int id;
string line;
string[] token;
var lineCount = File.ReadLines("C:\testresult\exam.txt").Count();
Console.WriteLine(lineCount);
string[] record = new string[lineCount];
try
{
StreamReader sr = new StreamReader("C:\testresult\exam.txt");
line = sr.ReadLine();
line = sr.ReadLine();
token = line.Split();
id = Convert.ToInt32(token[0]);
while (id != 0)
{
{
Console.WriteLine(token[1]);
line = sr.ReadLine();
token = line.Split();
id = Convert.ToInt32(token[0]);
for (int i = 0; i < lineCount; i = i + 2)
{
record[i]=Convert.ToString(id);
record[i + 1] = token[1];
Console.WriteLine(record[i], record[i + 1]);
}
}
}
sr.Close();
Console.ReadLine();
}
catch { }
}
}
}
谁能建议如何逐行读取并每次将 id 和 token[0] 存储到数组中的每个元素中?
让我们运行了解几个基本的学习要点。
- 不要做
try...catch
除非你真的要做某事 除了例外。 - StreamReader 是
IDisposable
所以应该在using
块中 - 发布的代码将遍历整个文件两次。小文件不是问题;但我想指出这一点。
- 尝试养成只声明变量的习惯,使其尽可能接近它们在其中使用的 'scope' - 它使您的代码更易于阅读和维护(例如,在移动代码时),并且有在循环内声明局部变量不会影响性能。
- String.Split总会给你一个项目(第0个)但是你在使用第一个项目
token[1]
而不检查是否有,当Id=0时不会有,这会给你一个 IndexOutOfRangeException。 - 你有一对没有明显原因的匹配大括号,可以而且应该删除它们(保持你的代码简单)。
- 对于
while
循环中的for
循环,您肯定感到困惑。您的while
循环将针对文件中除第一行以外的每一行执行,因此您只需要计算循环的次数。 - 如果你想让你的代码多一点 'defensive' 你可以使用 int.TryParse 而不是 Convert.ToInt32;但我假设你不担心那个。
所以这会给你...
static void Main(string[] args)
{
var records = new List<string>();
foreach (string line in File.ReadLines("C:\testresult\exam.txt").Skip(1))
{
var tokens = line.Split();
int id = Convert.ToInt32(tokens[0]);
if (id == 0)
{
break;
}
else if (tokens.Length > 1)
{
// It looks like you want the Id and values to be put consecutively in the same array, which doesn't seem very useful.
// I would have thought a Dictionary<int,string> would be more useful... but here you go.
records.Add(id.ToString());
records.Add(tokens[1]);
}
}
// If you really want records to be an array you can use "records.ToArray()"
Console.ReadLine();
}
您可以使用哈希Table来记录您的数据。 例如:
//Record data to Hash Table
Hashtable hash = new Hashtable();
StreamReader sr = new StreamReader(@"C:\Users\Binh\Desktop\C#\test\exam.txt");
while(sr.EndOfStream == false)
{
string line = sr.ReadLine();
if(!line.StartsWith("0") && !Regex.IsMatch(line, @"^[A-Z]"))
{
string[] info = line.Split(' ');//Split string
string strudent_id = info[0];
string student_ans = info[1];
hash.Add(strudent_id, student_ans);
}
}
sr.Close();
//Watch the result
foreach (DictionaryEntry item in hash)
{
Console.WriteLine(item.Key + "," + item.Value);
//OUTPUT:
//1007,ACBEDADCEBBCDEAABABA
//1009,BBBBBBBBBBBBBBBBBBBB
//1010,EEEEEEEEEEEEEEEEEEEE
//1012,DDDDDDDDDDDDDDDDDDDD
//1001,BCDEABCDEABCDEABCDEA
//1002,CDEABCDEABCDEABCDEAB
//1004,EABCDEABCDEABCDEABCD
//1006,ABBCCDDEEAABCDEABCDE
//1008,AAAAAAAAAAAAAAAAAAAA
//1011,CCCCCCCCCCCCCCCCCCCC
//1000,ABCDEABCDEABCDEABCDE
//1003,DEABCDEABCDEABCDEABC
//1005,AABBCCDDEEABCDEABCDE
}
例如:如果你想得到 ID 为 1009 的学生的答案
string answer = hash["1009"].ToString();
Console.WriteLine(answer);//Return BBBBBBBBBBBBBBBBBBBB