将文本文件分割为2d数组
本文关键字:2d 数组 分割 文本 文件 | 更新日期: 2023-09-27 18:15:02
所以我要做一个小的历史测试来帮助我学习。目前我已经硬编码数组,这就是我想从文本文件中读取数组的方式。我想改变这一点,这样我就可以添加和删除日期和事件通过更改文本文件
static string[,] dates = new string[4, 2]
{
{"1870", "France was defeated in the Franco Prussian War"},
{"1871", "The German Empire Merge into one"},
{"1905", "The '"Schliffin PLan'" devised"},
{"1914", "The Assassination of Franz Ferdinand and the start of WW1"},
//etc
}
数组仅仅是应该从文本文件中读入内容的占位符。我知道我应该使用一个流阅读器,然后分割它,但我不确定如何做到这一点。我试过使用两个列表,然后将它们推到数组中,像这样
//for date/event alteration
isDate = true;
//for find the length of the file, i don't know a better way of doing this
string[] lineAmount = File.ReadAllLines("test.txt");
using (StreamReader reader = new StreamReader("test.txt"))
{
for (int i = 0; i <= lineAmount.Length; i++)
{
if (isDate)
{
//use split here somehow?
dates.Add(reader.ReadLine());
isDate = false;
}
else
{
events.Add(reader.ReadLine());
isDate = true;
}
}
}
string[] dates2 = dates.ToArray();
string[] events2 = events.ToArray();
string[,] info = new string[,] { };
//could use dates or events for middle (they have the same amount)
//push the lists into a 2d array
for (int i = 0; i <= events2.Length; i++)
{
//gives an index out of bounds of array error
//possibly due to the empty array declaration above? not sure how to fix
info[0, i] = dates2[i];
info[1, i] = events2[i];
}
这是一个如何设置文本文件的例子:
1870,普法战争(法国战败),
1871,德意志帝国合并,
可以看出,文本文件的设置与数组几乎相同。我的问题是,如何将这个文本文件读入这种格式的2d数组
这里最大的问题是您正在尝试使用数组来完成此操作。除非你的程序知道一开始有多少行,否则它不会知道数组的大小。您将不得不猜测(最坏的情况是容易出错,最好的情况是效率低下),或者扫描文件以查找有多少个换行符(也是效率低下)。
使用一个列表,并将你读过的每一行添加到列表中。
如果每个条目的第二部分没有逗号,下面的代码将很好地解析您提到的文件:
List<string[ ]> entries = new List<string[ ]>( );
using ( TextReader rdr = File.OpenText( "TextFile1.txt" ) )
{
string line;
while ( ( line = rdr.ReadLine( ) ) != null )
{
string[ ] entry = line.Split( ',' );
entries.Add( entry );
}
}
一旦你有了你的清单,做任何你想做的事。可以像访问数组一样访问列表成员。最主要的区别是列表是一个动态大小的对象,而数组是固定在你最初创建它的大小。
该列表将是文本文件的精确副本,减去逗号,日期在每个字符串数组的第一个元素中,文本在第二个元素中。
这将把你的原始文件输出回屏幕,包括逗号和所有内容:
foreach ( string[ ] entry in entries )
{
Console.WriteLine( string.Join( ",", entry ) );
}
如果您想从数组中获得一个随机元素(您说过这是一个学习程序),那么您可以这样做:
Random rand = new Random();
while(true)
{
int itemIndex = rand.Next(0, entries.Length);
Console.WriteLine( "What year did {0} happen?", entries[itemIndex][1]);
string answer = Console.ReadLine();
if(answer == "exit")
break;
if(answer == entries[itemIndex][0])
Console.WriteLine("You got it!");
else
Console.WriteLine("You should study more...");
}
应该可以了。从文件中读取所有行,然后在逗号上分割并将其存储在数组中。
//Read the entire file into a string array, with each element being one line
//Note that the variable 'file' is of type string[]
var file = File.ReadAllLines(@"C:'somePath.yourFile.txt");
var events = (from line in file //For every line in the string[] above
where !String.IsNullOrWhiteSpace(line) //only consider the items that are not completely blank
let pieces = line.Split(',') //Split each item and store the result into a string[] called pieces
select new[] { pieces[0], pieces[1].Trim() }).ToList(); //Output the result as a List<string[]>, with the second element trimmed of extra whitespace
如果你需要访问第一个记录,你可以这样做:
var firstYear = events[0][0];
var firstDescription = events[0][1];
打破它…
ReadAllLines
只是打开一个文件,将内容读入数组,然后关闭它。LINQ语句:
- 遍历非空白的每一行
- 用逗号分隔每行,并创建一个临时变量(pieces)来将当前行存储在 中
- 将分割行的内容存储在数组 中
- 为每一行执行此操作,并将最终结果存储在一个列表中—因此您有一个数组列表